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
この問題を解決する安定した強力な方法は何ですか?
Ubuntuを使用してください。
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を無視することを意味します(そうでない場合はここに信号処理コードを指定します)。