Chạy tập lệnh khi đăng nhập mac [đã đóng]


280

Tôi tự hỏi liệu có ai có thể giúp tôi lấy tệp .sh để chạy khi tôi đăng nhập vào tài khoản của mình trên máy tính không. Tôi đang chạy Mac OS X 10.6.7.

Tôi có một tệp "example.sh" mà tôi muốn chạy khi đăng nhập vào máy tính của mình. Tôi không gặp vấn đề gì khi chạy nó khi tôi đã đăng nhập, nhưng tôi muốn nó chạy tự động.

Mọi người đang nói thêm nó vào tập tin shell đăng nhập, nhưng tôi không biết đó là đâu. Xin hãy giúp đỡ.


3
Đây không phải là lạc đề ... Tôi cần nó để khởi động trình nền Emacs của mình;) BTW câu trả lời tốt nhất là IMHO ứng dụng Lingon X.
HappyFace

1
Tôi không quan tâm nếu điều này lạc đề. Đó là câu trả lời tốt nhất tôi tìm thấy trên internet và nó xứng đáng được tôn trọng. Tôi đã bỏ qua nó cho những người khác lần đầu tiên tôi tìm kiếm một giải pháp và đó là một sai lầm lớn!
Sethmr

Câu trả lời:


378

Thực hiện theo điều này:

  • khởi đầu Automator.app
  • lựa chọn Application
  • nhấp Show libraryvào thanh công cụ (nếu ẩn)
  • thêm Run shell script(từ Actions/Utilities)
  • sao chép và dán tập lệnh của bạn vào cửa sổ
  • kiểm tra nó
  • lưu ở đâu đó (ví dụ bạn có thể tạo một Applicationsthư mục trong TRANG CHỦ của mình, bạn sẽ nhận được một your_name.app)

  • đi đến System Preferences-> Accounts->Login items

  • thêm ứng dụng này
  • kiểm tra & thực hiện;)

BIÊN TẬP:

Gần đây tôi đã nhận được một huy hiệu "Câu trả lời tốt" cho câu trả lời này. Mặc dù giải pháp của tôi rất đơn giản và hiệu quả, nhưng cách sạch nhất để chạy bất kỳ chương trình hoặc tập lệnh shell nào tại thời điểm đăng nhập được mô tả trong câu trả lời của @ trisweb , trừ khi, bạn muốn tương tác .

Với giải pháp tự động hóa, bạn có thể làm những việc như tiếp theo: ứng dụng đăng nhập ảnh chụp màn hình tự động

vì vậy, yêu cầu chạy tập lệnh hoặc thoát ứng dụng, hỏi mật khẩu, chạy quy trình công việc tự động hóa khác tại thời điểm đăng nhập, chạy ứng dụng có điều kiện vào thời gian đăng nhập, v.v.


2
@GregMiernicki LOL, chào buổi sáng ...;) Gần một năm trước đã thêm một EDIT vào câu trả lời của tôi, nơi cũng nói điều này. Nhưng, điều này đơn giản hơn một chút đối với người dùng trung bình, bởi vì việc tạo các tệp XML (plist), không thân thiện với nhiều người dùng. Dù sao - thanx cho một bình luận. ;)
jm666

4
@GregMiernicki và đừng quên, với giải pháp Automator, bạn có thể tạo tập lệnh đăng nhập TƯƠNG TÁC - ví dụ: tập lệnh sẽ yêu cầu bạn nhập một số mục (ví dụ: mật khẩu bổ sung hoặc bất cứ điều gì tương tự). Thế giới không chỉ có màu đen hoặc trắng - ít nhất, nó giống như một con ngựa vằn ... :) :)
jm666

2
@Coolvogel Chạy một daemon tại thời điểm đăng nhập chính xác là công việc cho giải pháp launchd - xem câu trả lời của trisweb. Nếu bạn có thể quản lý trình nền python, bạn chắc chắn có thể quản lý tệp cấu hình plist nơi bạn có thể quản lý tất cả các khía cạnh khởi động lại, v.v ...
jm666

3
Kudos đã chỉ ra câu trả lời khác là sạch nhất. Điều đó sẽ nhận được một huy hiệu công dân tốt :).
studgeek

2
Câu trả lời tuyệt vời. Không xuất PATH = / usr / local / bin: $ PATH, ở đầu tập lệnh, nếu bạn muốn chạy các lệnh như "cập nhật toàn cầu của nhà soạn nhạc" khi khởi động hệ thống.
Leonardo

377

tl; dr: sử dụng trình quản lý và trình khởi chạy quy trình riêng của OSX , launchd.

Để làm như vậy, làm một launchctldaemon. Bạn sẽ có toàn quyền kiểm soát tất cả các khía cạnh của kịch bản. Bạn có thể chạy một lần hoặc giữ sống như một daemon. Trong hầu hết các trường hợp, đây là cách để đi.

  1. Tạo một .plisttệp theo hướng dẫn trong tài liệu Apple Dev tại đây hoặc chi tiết hơn bên dưới.
  2. Đặt trong ~/Library/LaunchAgents
  3. Đăng nhập (hoặc chạy thủ công qua launchctl load [filename.plist])

Để biết thêm launchd, bài viết trên wikipedia khá hay và mô tả hệ thống cũng như các ưu điểm của nó so với các hệ thống cũ khác.


Đây là tệp plist cụ thể để chạy tập lệnh khi đăng nhập .

Đã cập nhật 2017/09/25 cho OSX El Capitan và mới hơn (tín dụng cho Jose Messias Jr ):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Label</key>
   <string>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Thay thế khóa <string>sau của Chương trình bằng lệnh mong muốn của bạn (lưu ý rằng bất kỳ tập lệnh nào được tham chiếu bởi lệnh đó phải được thực thi: chmod a+x /path/to/executable/script.shđể đảm bảo nó dành cho tất cả người dùng).

Lưu thành ~/Library/LaunchAgents/com.user.loginscript.plist

Chạy launchctl load ~/Library/LaunchAgents/com.user.loginscript.plistvà đăng xuất / đăng nhập để kiểm tra (hoặc để kiểm tra trực tiếp, chạy launchctl start com.user.loginscript)

Đuôi /var/log/system.logcho thông báo lỗi.

Điều quan trọng là đây là mục launchd dành riêng cho người dùng, vì vậy nó sẽ được chạy khi đăng nhập cho người dùng cụ thể. Trình nền khởi chạy dành riêng cho hệ thống (được đặt trong /Library/LaunchDaemons) được chạy khi khởi động.

Nếu bạn muốn một tập lệnh chạy khi đăng nhập cho tất cả người dùng, tôi tin rằng LoginHook là lựa chọn duy nhất của bạn và đó có lẽ là lý do nó tồn tại.


4
Đúng. FWIW Tôi thấy blog này có cùng một kỹ thuật hữu ích: Developernotes.com/archive/2011/04/06/169.aspx
Daniel James

8
Bạn bỏ qua việc đề cập đến những gì đáng ngờ về các hành động của Automator và tại sao chúng 'không được khuyến nghị'.
Mike Campbell

4
Đây là một tổng quan tốt về các hành động thư mục so với launchctl: apple.stackexchange.com/a/63731/38290 - Và một điều nữa về một trong những hạn chế của LoginHook (chỉ cho phép một tập lệnh) - superuser.com/a/377401 . Nó thực sự không phải là một phương pháp đáng ngờ hoặc kém, nhưng launchctlđơn giản là tốt hơn nhiều trong hầu hết các trường hợp và cho phép bạn kiểm soát nhiều hơn tất cả các khía cạnh có thể có của việc chạy tập lệnh của bạn. Theo nghĩa "tại sao lại sử dụng một phương thức kém khả năng hơn khi launchd tồn tại?" (Lưu ý tôi đã thay đổi câu đầu tiên để cho biết rằng cá nhân tôi không đề xuất những câu này cho tình huống này).
trisweb

3
Tự hỏi làm thế nào bạn sẽ tạo LaunchDaemon plist cái gì sẽ chạy mọi lúc khi người dùng đăng nhập? . Vì vậy, không phải khi hệ thống khởi động, mà là mọi lúc khi người dùng đăng nhập (thử với chu kỳ đăng xuất-đăng nhập). Bạn có thể vui lòng chỉ ra chính xác (không chỉ bla-bla) cách triển khai giải pháp tự động hóa (do bạn sai) ở trên với launchctl không?
cajwine

9
Tập tin Plist trong / Library / LaunchAgents / được chạy khi đăng nhập với id của người dùng đã đăng nhập. Tập tin Plist trong / Library / LaunchDaemons / được chạy khi khởi động với quyền root (id có thể được thay đổi bằng khóa Người dùng ).
Bain

42
  1. Tạo tập lệnh shell của bạn như login.shtrong thư mục $ HOME của bạn.

  2. Dán đoạn mã một dòng sau vào Trình chỉnh sửa tập lệnh:

    thực hiện tập lệnh shell "$ HOME / login.sh"

  3. Sau đó lưu nó dưới dạng một ứng dụng.

  4. Cuối cùng thêm ứng dụng vào các mục đăng nhập của bạn.

Nếu bạn muốn làm cho đầu ra kịch bản trực quan, bạn có thể trao đổi bước 2 cho việc này:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Nếu cần nhiều lệnh, một cái gì đó như thế này có thể được sử dụng:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

1
Tôi đã liên kết cái này, thứ duy nhất thiếu trình cài đặt dòng lệnh;)
sorin

1
Giải pháp tốt đẹp. Làm thế nào tôi có thể ẩn cửa sổ "đăng nhập"? Tôi đã thử đánh dấu vào các mục đăng nhập.
xgdgsc

1
@xgdgsc: Goto Go to System Preferences -> Accounts -> Login itemsvà đánh dấu vào ô ẩn cho ứng dụng này.
anubhava

1
@anubhava Như tôi đã nói, tôi đã kiểm tra hộp ẩn cho ứng dụng đăng nhập này. Nhưng nó vẫn xuất hiện và cần phải buộc phải thoát khi tắt máy tính.
xgdgsc

2
@xgdgsc: Ồ ok, bạn đã kiểm tra ~/Library/LaunchAgentsthư mục chưa?
anubhava
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.