GUI(lightdm)を介して実行されるbashスクリプトがあります。
スクリプト中のある行で、次のようにします。
Sudo service lightdm stop
-GUIを停止しますtty1
やtty7
など)を引き継ぎます。exec </dev/tty7 >/dev/tty7 2>&1
agetty
がTTYを制御している場合、簡単にSIGSTOP
を送信できます)。tty7
が推奨されます。これは、lightdm
をシャットダウンしている間、それが使用可能になるためです。問題は、bashスクリプトがlightdm
サービスの子であるということです。
したがって、Sudo service lightdm stop
の実行中に、スクリプト/プロセスを終了しようとします。
Nohup
を使用する必要があることがわかりましたが、既に実行中のスクリプト/プロセスをSIGHUP
の影響を受けないようにすることを好みます。
私は 提案disown
とbg
について見てきましたが、スクリプトファイルがインタラクティブモードではないため、bg
できません。また、set -m
を使用しても、とにかく押す必要があるため、役に立ちません。 CTRL+Z プロセスを一時停止するため(SIGTSTPを送信すると一時停止しますが、ファイルは実行を継続しません...)。
これを解決するための信頼性が高く堅牢なアプローチは何ですか?
Ubuntuの使用。
私は試した:
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
しかし、それも失敗しました...
実際、@ countermodeの答えはうまく機能します。
コードに小さな間違いがあったので、うまくいかないと思いました。
シェルスクリプトは、trap
キーワードを使用して独自のシグナルハンドラーを設定できます。シナリオでは、SIGHUPを無視したいので、ldmセッションを終了する前にどこかに電話をかけます
trap '' SIGHUP
どこ ''
(空の文字列)は、SIGHUPを無視することを示します(それ以外の場合は、ここでシグナル処理コードを指定します)。