GUI(lightdm)를 통해 실행되는 bash 스크립트가 있습니다.
스크립트의 특정 줄에서는 다음을 수행하고 싶습니다.
sudo service lightdm stop
- GUI 중지- 예를 들어 다음을 사용하여 TTY를 인수합니다
tty1
. (TTY를 제어하면 쉽게 보낼 수 있습니다) 닫혀 있으면 사용할 수 있기 때문에 선호됩니다.tty7
exec </dev/tty7 >/dev/tty7 2>&1
agetty
SIGSTOP
tty7
lightdm
문제는 bash 스크립트가 lightdm
서비스의 첨자라는 것입니다.
따라서 실행되면 sudo service lightdm stop
내 스크립트/프로세스를 종료하려고 시도합니다.
을(를) 사용해야 한다고 생각 nohup
하지만 내 것을 갖고 싶습니다.이미 실행 중스크립트/프로세스는 영향을 받지 않습니다 SIGHUP
.
제안하지만 스크립트 파일이 대화형 모드가 아니어서 할 수 disown
없습니다 . 또한 프로세스를 일시 중지하려면 +를 눌러야 하기 때문에 를 사용해도 도움이 되지 않습니다 (SIGTSTP를 보내면 일시 중지되지만 파일은 계속 실행되지 않습니다...).bg
bg
set -m
CTRLZ
이 문제를 해결하는 안정적이고 강력한 방법은 무엇입니까?
우분투를 사용하세요.
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을 무시한다는 의미입니다(그렇지 않으면 여기에 신호 처리 코드를 지정합니다).