Có vẻ như Apple không quan tâm đến việc thay thế móc đăng xuất, vì họ đã đóng vấn đề của tôi để hỏi về vấn đề này.
Tuy nhiên, một trong những cải tiến trong Yosemite là launchd hiện gửi đúng tín hiệu xuống các tập lệnh shell. Điều này có nghĩa là bây giờ bạn có thể thực hiện một tác vụ đăng xuất như vậy:
Dưới đây là một ví dụ logout.sh:
#!/bin/sh
onLogout() {
echo 'Logging out' >> ~/Logs/logout.sh.log
exit
}
trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
sleep 86400 &
wait $!
done
Điều này chỉ đơn giản là ngủ (không đồng bộ, thực hiện đồng bộ mà không có ký hiệu và dường như không hoạt động) cho đến khi nhận được một trong các tín hiệu bị mắc kẹt, tại đó nó sẽ thực thi onLogout
chức năng.
Tất cả những gì bạn cần làm là khởi chạy tập lệnh đó bằng cách sử dụng RunAtLoad
tác nhân khởi chạy hoặc khởi chạy trình nền và nó sẽ chạy khi đăng xuất hoặc tắt máy, mặc dù điều quan trọng là phải nhớ rằng các tác vụ chỉ có một khoảng thời gian giới hạn để hoàn thành trước khi chúng bị giết , vì vậy, điều này không nên được sử dụng để chạy bất cứ thứ gì mất nhiều thời gian hoặc yêu cầu kết nối mạng có thể bị trì hoãn, v.v.
Tất nhiên điều này không có tác dụng với bất kỳ ai trên Mavericks hoặc sớm hơn, nhưng dưới Yosemite, điều này giờ đây dường như hoạt động như mong đợi; Vì vậy, tôi đã thực sự làm điều đó ngay từ đầu, launchd
chỉ là không gửi tín hiệu đúng cách :)
LƯU Ý: Để làm việc này, các kịch bản shell dường như cần được thực thi trực tiếp bằng cách khởi chạy, tức là - nó không nên được gọi qua sh
. Vì vậy, nếu nó được đặt trong ~/Library/Scripts/foo.sh
các đối số chương trình của bạn có thể trông như sau:
<key>ProgramArguments</key>
<array>
<string>~/Library/Scripts/foo.sh</string>
<string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
line 8: syntax error near unexpected token ;'
(với một phần mộ trước dấu chấm phẩy)