Tty
如果父程序死亡,子程序繼續執行
我有一個通過 GUI (lightdm) 執行的 bash 腳本。
在腳本的某些行中,我希望它:
sudo service lightdm stop
- 停止圖形使用者界面- 使用 eg: (如果控制 TTY,我們可以輕鬆發送它)接管一個 TTY (like
tty1
or )。是首選,因為在關閉時,它將可用。tty7``exec </dev/tty7 >/dev/tty7 2>&1
agetty``SIGSTOP
tty7``lightdm
問題是 bash 腳本是該
lightdm
服務的子項。因此,在執行時
sudo service lightdm stop
- 它會嘗試終止我的腳本/程序。我發現我需要使用
nohup
,但我更喜歡讓我已經執行的腳本/程序免疫SIGHUP
.我已經看到了有關的建議
disown
,bg
但是腳本文件未處於互動模式,因此我不能bg
這樣做。使用set -m
也無濟於事,因為無論如何我需要按CTRL
+Z
來暫停我的程序(發送 SIGTSTP 將暫停它,但文件不會繼續執行……)。解決此問題的可靠且穩健的方法是什麼?
使用 Ubuntu。
更新 10 月 8 日 21:35 UTC - 回复 @countermode:
我試過:
trap '' HUP service lightdm stop
也試過:
trap '' SIGHUP service lightdm stop
但它失敗了。我知道它失敗了,因為在
service lightdm stop
我向文件寫入一些數據的行之後。那些文件修改時間太舊(一天前),因此它不起作用。我試圖捕捉所有我認為我錯過的信號,使用:
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 的答案效果很好。
我在程式碼中有一個小錯誤,所以我認為它不起作用。
trap
Shell 腳本可以使用關鍵字設置自己的信號處理程序。在您的場景中,您想忽略 SIGHUP,因此您會在終止 ldm 會話之前呼叫某處trap '' SIGHUP
其中
''
(空字元串)表示您要忽略 SIGHUP(否則您將在此處指定信號處理程式碼)。