Làm cách nào để Mac OS X chạy chương trình trước khi tắt?


9

Tôi đang cố gắng để Mac OS X lưu tất cả các máy ảo VirtualBox của mình khi khởi động lại. Tôi đã có một tập lệnh thực hiện điều này, nhưng tôi cần OS X để tự động chạy tập lệnh này trước khi khởi động lại.

Khi Mac OS X khởi động lại, nó có chạy / sbin / khởi động lại không?

Hoặc làm thế nào khác điều này có thể đạt được?



Đó không phải là một bản sao. Tôi không muốn biết cách chạy tập lệnh hoặc chương trình khi đăng xuất. Tôi muốn biết làm thế nào để chạy một kịch bản hoặc chương trình khi tắt.
Andrew J. Brehm

1
Bạn đúng. Không phải là một bản sao chính xác. Câu trả lời trong câu hỏi được liên kết khuyên người dùng nên đặt tập lệnh của họ /etc/rc.shutdown.localđể chạy tập lệnh khi tắt. Có vẻ như đó là những gì bạn đang tìm kiếm.
michaelmichael

Trang web này dường như đưa ra tuyên bố đó: hint.macworld.com/article.php?story=20051013141919568
Andrew J. Brehm

Phương thức RC.shutdown.local không hoạt động.
Andrew J. Brehm

Câu trả lời:


5

Mặc dù Apple khuyên bạn nên sử dụng " launchd ", cách dễ nhất là tạo tập lệnh shell bằng cách sử dụng, ví dụ, pico của Terminal:

pico /Users/Shared/logoutHook.sh

Các tập tin có thể chứa một cái gì đó như:

#!/bin/bash
say 'Hasta la vista baby!'

Sau đó đưa ra quyền thực thi:

sudo chmod +x /Users/Shared/logoutHook.sh

Cuối cùng, hook script vào thủ tục đăng xuất:

sudo defaults write com.apple.loginwindow LogoutHook /Users/Shared/logoutHook.sh

Nếu bạn bắt đầu một ứng dụng khác, vì tôi chưa thử nghiệm điều này, tôi nghĩ rằng nó có thể hữu ích để cảnh báo bản thân tôi và bạn rằng:

  • Chúng ta có thể cần phải tắt tín hiệu tắt máy để thực hiện những gì chúng ta muốn;

  • Sau đó gửi một cái mới (coi chừng không giết tín hiệu được gửi bởi chính
    tập lệnh của chúng tôi )


Nếu bạn muốn loại bỏ móc:

sudo defaults delete com.apple.loginwindow LogoutHook

Nếu sử dụng " launchd ", ý tưởng sẽ là bắt tín hiệu SIGTERM. Hãy xem: / System / L Library / LaunchDaemons / com.apple.shutdown_monitor.plist


4

Launchd gửi một cảnh báo sớm về việc tắt máy cho tất cả các tập lệnh / trình nền có chương trình con StopService () . Điều này cho quá trình của bạn nhiều thời gian nhất để dọn dẹp.

Chỉ cần sử dụng launchd để bắt đầu tập lệnh và để nó chạy trong nền cho đến khi thoát ra.

Sau khi các dịch vụ nhận được cảnh báo sớm đóng cửa, Tất cả các quy trình đều nhận được SIGTERMtín hiệu vài giây trước khi bắt đầu SIGKILL.

Bạn có thể tạo một kịch bản ngủ và bẫy SIGTERM để chạy lệnh của bạn khi thời điểm đó đến. Bạn sẽ phải xem nếu điều đó cho phép đủ thời gian trong thực tế để các lệnh thực thi. Điều này tránh được một chút mã hóa, nhưng không nhiều - nói chung tốt hơn là chỉ tạo một daemon từ kịch bản shell.


Từ góc độ lịch sử - /sbin/rebootvà runlevels chưa bao giờ tồn tại trên Darwin / OS X và rc.shutdownbị phản đối cùng với phần còn lại rcbây giờ launchdlà ông chủ. Bạn có thể sử dụng RC.shutdown trên hổ hoặc trước đó (Tôi không có một trong những hình ảnh đó để kiểm tra ngay bây giờ) Lion chắc chắn đã xóa tất cả các dấu tích của RC.d và init.d.

Bạn có thể muốn xem nếu người theo dõi giấc ngủ sẽ giúp đỡ trong trường hợp của bạn. Tôi đã không sử dụng nó trong một thời gian dài - nhưng nó chắc chắn nhằm mục đích giải quyết vấn đề nan giải của bạn.


Hóa ra "không dùng nữa" có nghĩa là "không hoạt động". :-(
Andrew J. Brehm

Yup - những cảnh báo bắt đầu với Tiger và tôi đoán nó đã biến mất với Leopard - thật khó để nhớ lại với tất cả những thay đổi của Lion chạy quanh não tôi.
bmike

Điều này thực sự làm phức tạp vấn đề và làm cho Mac OS X trở thành một nền tảng máy chủ rất tệ.
Andrew J. Brehm

launchd hoàn toàn có khả năng chạy các script khi tắt máy. Có lẽ tôi nên chỉnh sửa lịch sử và để sự thật đó rõ ràng hơn. Theo cách nào thì launchd thất bại khi bạn cần chạy một kịch bản khi tắt máy?
bmike

Tôi không biết làm thế nào để khởi chạy các kịch bản chạy khi tắt máy. Tôi sử dụng launchd để bắt đầu mọi thứ khi khởi động.
Andrew J. Brehm
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.