로그 아웃 후크를 사용하지 않고 로그 아웃시 스크립트 실행


10

사용자가 로그 아웃 할 때 몇 가지 정리 명령을 실행하려고 시도했지만 여전히 작동하지만 이전 로그 아웃 후크 기능은 더 이상 사용되지 않으므로 더 이상 우리와 함께하지 않을 수 있습니다.

불행하게도, launchd로그인 후크에 대한 편리한 대안을 제공 하지만, 로그 아웃 후크를 대체하는 확실한 방법은 없습니다.

이미 로그인 할 때 시작되는 쉘 스크립트를 작성하는 실험을 해왔으며 킬 신호가 수신 될 때까지 잠자기 상태이지만 작동하지 않는 것 같습니다 (스크립트는 정상적인 작동 중에 신호를 수신하지 않습니다).

그렇지 않으면 로그 아웃시 빠른 명령을 실행하는 가장 좋은 방법이 무엇인지 잘 모르겠습니다. 이를 수행 할 수있는 타사 유틸리티가 있지만 더 이상 "올바른"방법이 있습니까?

답변:


7

애플은 로그 아웃 후크 교체에 관심이없는 것 같습니다.

그러나 요세미티에서 개선 된 기능 중 하나는 이제 시작되어 셸 스크립트로 신호를 올바르게 전송한다는 것입니다. 이것이 의미하는 바는 이제 다음과 같이 로그 아웃 작업을 수행 할 수 있다는 것입니다.

다음은 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

이것은 트랩 된 신호 중 하나를 수신 할 때까지 잠자기 (비동기 적으로, 앰퍼샌드없이 동기식으로 수행하고 작동하지 않는 것 같습니다).이 시점에서 onLogout함수 를 실행합니다 .

RunAtLoad시작 에이전트 또는 시작 데몬을 사용하여 해당 스크립트를 시작하기 만하면 로그 아웃 또는 종료시 실행되지만 작업이 종료되기 전에 완료하는 데 시간이 제한되어 있다는 점을 명심해야합니다. 따라서 시간이 오래 걸리거나 지연 될 수있는 네트워크 연결이 필요한 항목을 실행하는 데 사용해서는 안됩니다.

물론 이것은 매버릭스 또는 그 이전의 사람에게는 아무 소용이 없지만 요세미티에서는 이제 예상대로 작동하는 것 같습니다. 그래서 실제로 처음부터 launchd제대로하고 있었지만 신호를 제대로 보내지 않았습니다. :)

참고 :이 작업을 수행하려면 셸 스크립트를 시작하여 직접 실행해야합니다. 즉,을 통해 호출하면 안됩니다 sh. 따라서 ~/Library/Scripts/foo.sh프로그램에 배치되면 인수는 다음과 같습니다.

<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 ;'(세미콜론 앞에 무덤과 함께)
Jason

여러분, @Jason이 맞습니다. 너무 단순화했다고 생각합니다. 실제 예제와 더 비슷하게 조정했습니다.
Haravikk

launchctl을 사용하여 언로드하면 트리거되지만 로그 아웃하거나 다시 시작할 때는 트리거되지 않습니다. 왜?
Trellis 2018 년

네트워크가 다운되기 전에 실행할 방법이 있습니까?
user824963

2

iHook을 사용하여 로그인 / 로그 아웃 후크를 실행할 수 있는데, 요세미티의 Bash 및 Python으로 작성된 비 대화식 로그인 및 로그 아웃 후크에 대해 여전히 작동하는 것으로 나타났습니다.

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


불행히도 이것은 여전히 ​​후드 아래에서 정상적인 로그 아웃 후크를 사용합니다.
0942v8653

0

검색 엔진에서 온 다른 사람들이 로그 아웃 후크 사용에 신경 쓰지 않으면 다음과 같이 실행하십시오.

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

다음 ~/.logouthook에 로그 아웃 할 때 실행됩니다.

LogoutHook키 값은 쉘 명령이 아닌 실행 파일의 경로 여야합니다. defaults명령 수정 /var/root/Library/Preferences/com.apple.loginwindow.plist.


어쨌든 대안으로 제공해 주셔서 감사합니다. 그러나 마지막 관심사는 OS X의 마지막 몇 버전에서 로그인 및 로그 아웃 후크가 더 이상 사용되지 않는다는 것입니다. 나는 (이 대부분 UI와 연속성의 변화에 초점을 맞춘 이후) 그들은 여전히 요세미티에서 기능을 기대하지만 그것으로 대체되고 오래된 시작 항목처럼, 언제든지 갈 수있는 것 같아 launchd, 그냥이없는 수치 RunBeforeUnload또는 이와 유사한 옵션 .
Haravikk

0

시작된 로그 아웃 항목을 10.10.1에서도 작동시킬 수 없지만 루트의 "com.apple.loginwindow.plist"에있는 LogoutHook 키는 제대로 작동합니다. 시작된 방법에 대한 다른 예가 있습니까?

어쨌든, 로그 아웃 할 때 시스템 볼륨을 죽이기 위해 AppleScript를 작성하여 다음 시작시 시작 차임 소리가 들리지 않습니다. 내가 해결하지 않은 것은 단일 LogoutHook 키를 기반으로 여러 로그 아웃 명령을 관리하거나 여러 LogoutHook 키를 저장할 수 있는지 여부에 대한 세부 정보이므로 Lingon으로 관리 할 수있는 Launchd 메서드에 여전히 관심이 있습니다. 또는 원본보다 훨씬 좁은 범위를 가진 Lingon 3조차도 (App Store에있을 수 있음).

current_Vol을 (쉘 스크립트 "osascript -e \"(볼륨 설정 가져 오기) \ "")로 설정)
버튼이 반환 된 경우 ( "대화창 시작, 차음 또는 복원 하시겠습니까?"단추 대화 상자 표시 ( "침묵", "복원", "취소"} 기본 버튼 1))가 "침묵"인 경우
    쉘 스크립트 "mkdir -p / usr / local / logouttask; echo '#! / bin / bash
# 로그 아웃 스크립트
osascript -e \ "set volume 0 \" '> / usr / local / logouttask / logoutscript; sudo 기본값은 com.apple.loginwindow LogoutHook / usr / local / logouttask / logoutscript; chmod + x / usr / local / logouttask / logoutscript를 작성합니다. "관리자 권한으로
그밖에
    시험
        관리자 권한으로 쉘 스크립트 "sudo defaults 쓰기 com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutscript"수행
        디스플레이 대화창 "종료 또는 재시작시 볼륨 설정이 0보다 크면 시작 차임이 들립니다." 버튼 { "OK"} 기본 버튼 1
    오류시 error_message 번호 error_number
        error_number가 1이면
            디스플레이 대화창 "로그 아웃시 시스템 볼륨을 0으로 설정하는 스크립트가 존재하지 않습니다. 종료 또는 재시작시 볼륨 설정이 0보다 크면 시작 차임 소리가납니다." 버튼 { "OK"} 기본 버튼 1
        그밖에
            디스플레이 대화 상자 "오류 :"& error_number & "."및 error_message 단추 { "OK"} 기본 단추 1
        경우 종료
    최종 시도
경우 종료

로그 아웃 항목을 어떻게 호출합니까? 에 대한 예제 쉘 스크립트는 직접 사용 (을 사용하지 않아야 함 sh)해야하므로 실행 가능한 파일이어야합니다. 제 대답에 주목할 것입니다.
하라 빅

업데이트 해 주셔서 감사합니다. 최대한 빨리 노력하고 알려 드리겠습니다.
Trellis

터미널에서 호출하는 plist에서 "launchctl unload"를 실행하여 foo.sh에 포함 된 이벤트 만 트리거 할 수 있습니다. 로그 아웃해도 트리거되지 않습니다.
Trellis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.