Tty

如果父程序死亡,子程序繼續執行

  • October 9, 2016

我有一個通過 GUI (lightdm) 執行的 bash 腳本。

在腳本的某些行中,我希望它:

  1. sudo service lightdm stop- 停止圖形使用者界面
  2. 使用 eg: (如果控制 TTY,我們可以輕鬆發送它)接管一個 TTY (like tty1or )。是首選,因為在關閉時,它將可用。tty7``exec </dev/tty7 >/dev/tty7 2>&1
    agetty``SIGSTOP

tty7``lightdm

問題是 bash 腳本是該lightdm服務的子項。

因此,在執行時sudo service lightdm stop- 它會嘗試終止我的腳本/程序。

我發現我需要使用nohup,但我更喜歡讓我已經執行的腳本/程序免疫SIGHUP.

我已經看到了有關的建議disownbg但是腳本文件未處於互動模式,因此我不能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 的答案效果很好。

我在程式碼中有一個小錯誤,所以我認為它不起作用。

trapShell 腳本可以使用關鍵字設置自己的信號處理程序。在您的場景中,您想忽略 SIGHUP,因此您會在終止 ldm 會話之前呼叫某處

trap '' SIGHUP

其中''(空字元串)表示您要忽略 SIGHUP(否則您將在此處指定信號處理程式碼)。

引用自:https://unix.stackexchange.com/questions/314989