Chạy Script khi đăng xuất mà không sử dụng Hookout đăng xuất


11

Tôi đã tìm cách chạy một vài lệnh dọn dẹp khi người dùng đăng xuất, tuy nhiên tính năng hook logout cũ, mặc dù vẫn hoạt động, đã bị từ chối trong một thời gian vì vậy có thể không ở bên chúng tôi lâu hơn nữa.

Thật không may, mặc dù launchdcung cấp một sự thay thế thuận tiện cho các hook đăng nhập, nhưng không có sự thay thế rõ ràng như vậy cho các hook logout.

Tôi đã thử nghiệm tạo một tập lệnh shell được khởi chạy khi đăng nhập và chỉ cần ngủ cho đến khi nhận được tín hiệu tiêu diệt, tuy nhiên điều này dường như không hoạt động (tập lệnh không bao giờ nhận được tín hiệu trong khi hoạt động bình thường).

Nếu không, tôi không chắc cách tốt nhất để chạy lệnh nhanh khi đăng xuất là gì? Tôi biết có một số tiện ích của bên thứ ba có thể làm điều đó, nhưng liệu có cách nào "chính xác" để làm điều này nữa không?

Câu trả lời:


7

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 onLogoutchứ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 RunAtLoadtá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, launchdchỉ 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.shcá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/>

Khi tôi chạy tập lệnh này, nó sẽ trả về line 8: syntax error near unexpected token ;'(với một phần mộ trước dấu chấm phẩy)
Jason

Rất tiếc, bạn nói đúng @Jason, tôi nghĩ rằng tôi đã đơn giản hóa nó quá nhiều, tôi đã điều chỉnh nó gần giống với một ví dụ hoạt động hơn.
Harastak

Nó kích hoạt khi tôi tải nó bằng launchctl, nhưng không phải khi tôi đăng xuất hoặc khởi động lại. Tại sao?
Trellis

Có cách nào để chạy nó trước khi mạng ngừng hoạt động không?
filippo

2

Bạn có thể sử dụng iHook để chạy các móc đăng nhập / đăng xuất mà tôi thấy vẫn hoạt động cho các móc đăng nhập và đăng xuất không tương tác được viết bằng Bash và Python trên Yosemite.

http://rsug.itd.umich.edu/software/ihook/


Thật không may, cái này vẫn sử dụng móc đăng xuất bình thường dưới mui xe.
0942v8653

0

Nếu những người khác đến đây từ các công cụ tìm kiếm không quan tâm đến việc sử dụng hook logout, hãy chạy ví dụ:

sudo defaults write com.apple.loginwindow LogoutHook '~/.logouthook';echo $'#!/usr/bin/env bash\n\nsay a'>~/.logouthook;chmod +x ~/.logouthook

Sau đó ~/.logouthookđược chạy lần sau khi bạn đăng xuất.

Giá trị của LogoutHookkhóa phải là đường dẫn đến lệnh thực thi và không phải là lệnh shell. Các defaultslệnh Sửa /var/root/Library/Preferences/com.apple.loginwindow.plist.


Cảm ơn vì đã cho nó như một giải pháp thay thế, nhưng mối quan tâm của tôi là các móc đăng nhập và đăng xuất đã bị phản đối trong vài phiên bản OS X mới nhất; mặc dù tôi hy vọng chúng vẫn hoạt động trong Yosemite (vì nó chủ yếu tập trung vào giao diện người dùng và thay đổi liên tục) có vẻ như nó có thể đi bất cứ lúc nào, giống như các mục khởi động cũ bị thay thế launchd, chỉ là một sự xấu hổ mà nó không có RunBeforeUnloadhoặc tùy chọn tương tự .
Harastak

0

Tôi cũng không thể làm cho mục đăng xuất launchd hoạt động trong 10.10.1, nhưng khóa LogoutHook trong "com.apple.loginwindow.plist" của root hoạt động tốt. Có ví dụ nào khác cho phương thức launchd không?

Dù sao, tôi đã viết một AppleScript để tiêu diệt khối lượng hệ thống khi đăng xuất để tiếng chuông khởi động sẽ không được nghe trong lần khởi động tiếp theo. Những gì tôi chưa tìm ra là các chi tiết để quản lý nhiều lệnh đăng xuất dựa trên một khóa LogoutHook duy nhất hoặc liệu có thể lưu trữ nhiều khóa LogoutHook hay không, vì vậy tôi vẫn quan tâm đến phương thức Launchd, có thể được quản lý bằng Lingon, hoặc thậm chí Lingon 3, có phạm vi hẹp hơn nhiều so với bản gốc (có lẽ tồn tại trong kho ứng dụng).

đặt current_Vol thành (tập lệnh shell "osascript -e \" âm lượng đầu ra của (lấy cài đặt âm lượng) \ "")
nếu nút được trả về (hộp thoại hiển thị "Bạn có muốn tắt tiếng chuông khởi động, khôi phục hoặc hủy không?" các nút {"Im lặng", "Khôi phục", "Hủy"} nút mặc định 1) là "im lặng"
    thực hiện tập lệnh shell "mkdir -p / usr / local / logouttask; echo '#! / bin / bash
# kịch bản đăng xuất
osascript -e \ "đặt âm lượng 0 \" '> / usr / local / logouttask / logoutcript; sudo mặc định viết com.apple.loginwindow LogoutHook / usr / local / logouttask / logoutcript; chmod + x / usr / local "với đặc quyền của quản trị viên
khác
    thử
        làm shell script "sudo mặc định viết com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutcript" với đặc quyền của quản trị viên
        hộp thoại hiển thị "Chuông báo khởi động sẽ được nghe nếu cài đặt âm lượng lớn hơn 0 khi tắt hoặc khởi động lại." nút {"OK"} nút mặc định 1
    về lỗi error_message số error_number
        nếu error_number là 1 thì
            hộp thoại hiển thị "Tập lệnh đặt âm lượng hệ thống về 0 khi đăng xuất không tồn tại. Tiếng chuông khởi động sẽ được nghe nếu cài đặt âm lượng lớn hơn 0 khi tắt hoặc khởi động lại." nút {"OK"} nút mặc định 1
        khác
            hộp thoại hiển thị "Lỗi:" & error_number & "." & các nút error_message {"OK"} nút mặc định 1
        kết thúc nếu
    kết thúc thử
kết thúc nếu

Làm thế nào bạn đang gọi các mục đăng xuất? Kịch bản shell ví dụ của tôi cho các nhu cầu cần được gọi trực tiếp (không sử dụng sh) vì vậy nó cần phải là một tệp có thể thực thi được, tôi sẽ lưu ý rằng trong câu trả lời của tôi.
Harastak

Cảm ơn đã cập nhật. Tôi sẽ cố gắng sớm nhất có thể và cho bạn biết.
Trellis

Tôi chỉ có thể kích hoạt sự kiện có trong foo.sh bằng cách chạy "launchctl unload" trên plist gọi nó trong Terminal. Đăng xuất không kích hoạt nó.
Trellis
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.