상위 프로세스가 종료되면 하위 프로세스가 계속 실행됩니다.

상위 프로세스가 종료되면 하위 프로세스가 계속 실행됩니다.

GUI(lightdm)를 통해 실행되는 bash 스크립트가 있습니다.

스크립트의 특정 줄에서는 다음을 수행하고 싶습니다.

  1. sudo service lightdm stop- GUI 중지
  2. 예를 들어 다음을 사용하여 TTY를 인수합니다 tty1. (TTY를 제어하면 쉽게 보낼 수 있습니다) 닫혀 있으면 사용할 수 있기 때문에 선호됩니다.tty7exec </dev/tty7 >/dev/tty7 2>&1
    agettySIGSTOP
    tty7lightdm

문제는 bash 스크립트가 lightdm서비스의 첨자라는 것입니다.
따라서 실행되면 sudo service lightdm stop내 스크립트/프로세스를 종료하려고 시도합니다.

을(를) 사용해야 한다고 생각 nohup하지만 내 것을 갖고 싶습니다.이미 실행 중스크립트/프로세스는 영향을 받지 않습니다 SIGHUP.
제안하지만 스크립트 파일이 대화형 모드가 아니어서 할 수 disown없습니다 . 또한 프로세스를 일시 중지하려면 +를 눌러야 하기 때문에 를 사용해도 도움이 되지 않습니다 (SIGTSTP를 보내면 일시 중지되지만 파일은 계속 실행되지 않습니다...).bgbgset -mCTRLZ

이 문제를 해결하는 안정적이고 강력한 방법은 무엇입니까?
우분투를 사용하세요.


10월 8일 21:35 UTC에 업데이트됨 - @countermode에 답장:

나는 시도했다:

trap '' HUP
service lightdm stop

또한 시도했습니다:

trap '' SIGHUP
service lightdm stop

그러나 그것은 실패했습니다. 그 줄 이후에 service lightdm stop파일에 일부 데이터를 썼기 때문에 실패했다는 것을 알고 있습니다 . 해당 파일의 수정 시간이 너무 오래되어(1일 전) 작동하지 않습니다.

나는 다음을 사용하여 누락된 것으로 생각되는 모든 신호를 포착하려고 시도했습니다.

trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        trap "trap_handler $sig" "$sig"
    done
}
trap_handler() {
    echo -e " \n Caught signal $1 \n" >>/path_to_some_folder/_signals.txt
}
echo "" >/path_to_some_folder/_signals.txt
signals_list=""
for i in {1..64} ; do
    signals_list+="$(kill -l $i) "
done
trap_with_arg trap_handler 0 $signals_list

service lightdm stop

여기에 제안된 대로.
캡처된 모든 신호는 (왼쪽 첫 번째) HUP, CONT, 입니다 0.

그래서 나는 다음을 시도한다:

trap '' 0 HUP CONT
service lightdm stop

하지만 역시 실패했다...


10월 9일 08:46 UTC에 업데이트되었습니다:

실제로 @countermode의 답변이 잘 작동합니다.
내 코드에 작은 버그가 있어서 제대로 작동하지 않는 것 같아요.

답변1

쉘 스크립트는 키워드를 사용하여 자체 신호 처리기를 설정할 수 있습니다 trap. 귀하의 시나리오에서는 SIGHUP을 무시하여 ldm 세션을 종료하기 전에 어딘가에 전화할 수 있기를 원합니다.

trap '' SIGHUP

여기서 ''(빈 문자열)은 SIGHUP을 무시한다는 의미입니다(그렇지 않으면 여기에 신호 처리 코드를 지정합니다).

관련 정보