親プロセスが終了すると、子プロセスは引き続き実行されます。

親プロセスが終了すると、子プロセスは引き続き実行されます。

GUI(lightdm)を介して実行されるbashスクリプトがあります。

スクリプトの特定の行では、次のことをしたいと思います。

  1. sudo service lightdm stop- GUIの停止
  2. たとえば、次のようにTTYを引き継ぎますtty1。 (TTYを制御すれば簡単に送信できます) 閉じていると使えるので好みます。tty7exec </dev/tty7 >/dev/tty7 2>&1
    agettySIGSTOP
    tty7lightdm

問題は、bashスクリプトがlightdmサービスの添え字であることです。
したがって、実行されると、sudo service lightdm stop私のスクリプト/プロセスを終了しようとします。

を使うべきだと思いますnohupが、私のものが欲しいです。すでに実行中スクリプト/プロセスは影響を受けませんSIGHUP
提案ただし、スクリプトファイルが対話型モードではないため、disownできません。また、プロセスを一時停止するには+を押す必要があるため、を使用しても役に立ちません(SIGTSTPを送信すると一時停止しますが、ファイルは実行されません...)。bgbgset -mCTRLZ

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

おすすめ記事