Bashでサブプロセスの信号マスクを設定する

Bashでサブプロセスの信号マスクを設定する

私の問題は次のとおりです。呼び出し時にコマンドライン引数を追加する小さなラッパースクリプトを作成しようとしています。呼び出し側がUSR1Xorgのシグナルを待っています。 XSERVERのマニュアルページから:

SIGUSR1

この信号は、上記の信号とはまったく異なる方法で使用されます。サーバーが起動したら、SIGUSR1が通常のSIG_DFLの代わりにSIG_IGNに継承されていることを確認してください。この場合、サーバーはさまざまな接続シナリオを設定し、SIGUSR1を親プロセスに送信します。 Xdmは、この機能を使用してサーバーに接続できるタイミングを識別します。

私は単に信号をキャッチして渡すことができると思います。

#!/bin/bash
parent_trap(){
   echo sending USR1 to $PPID &> /tmp/wrapper.log
   kill -USR1 $PPID
}
trap "parent_trap" USR1
Xorg $@ (extra stuff) &
wait

しかし、もちろん、これはスクリプト自体が呼び出し元によって無視されるため機能しませんUSR1。私がしなければならないのは、スクリプトにシグナルの無視を停止させるだけでなく、何らかの方法でXorgを起動してUSR1無視することです(マンページの動作をトリガーするため)。 .)

Bash/他のスクリプト言語でこれは可能ですか?いくつかの理由でソリューションのコンパイルを避けたいのですが、不可能なことではありません。これが完全に間違っていると考えることも可能であり、USR1Xorgで発信者に連絡する他の方法があります。

ベストアンサー1

新しいスクリプト

シグナルを使って素晴らしい仕事をするのではなく、次のことをお勧めします。

$ cat xorg_wrapper
#!/bin/bash

exec Xorg $@ (extra stuff)

どのように動作しますか?

exec上記を説明するために、上記のスクリプトのメカニズムを示すのに役立つより詳細な例があります。

$ cat xorg.bash
#!/bin/bash

echo "script's PID: $$"
sleep 5
echo "starting fakeXorg..."
exec sleep 5

# Nothing below here will execute due to exec
echo $!
echo "fakeXorg finished..."
sleep 5

これは指定されたようにXorgを起動しますが、私たちが使用したexecコマンドはXorg同じPIDを使用してxorg.bashスクリプトを独自に置き換えるためです。

メモ:上記の最後の3行の目的は、xorg.bashコマンドが実行された後に再生/実行されなくなったことを証明することですexec sleep ...

はい

まずスクリプトを実行します。

$ ./xorg.bash
script's PID: 22471

...5 seconds passes...

starting fakeXorg...

...now the exec runs and 5 more seconds pass...

$

これを監視するために別のシェルで使用している場合は、ps auxf次のような結果を見ることができます。

ステップ1 - xorg.bashの事前実行
$ ps auxf
....
root     21184  0.0  0.3 116596  3412 pts/2    S    20:19   0:00                  \_ /bin/bash
root     22471  0.0  0.1 113176  1400 pts/2    S+   20:43   0:00                      \_ /bin/bash ./xorg.bash
root     22472  0.0  0.0 107948   348 pts/2    S+   20:43   0:00                          \_ sleep 5
ステップ2 - xorg.bashを実行した後
$ ps auxf
....
root     21184  0.0  0.3 116596  3412 pts/2    S    20:19   0:00                  \_ /bin/bash
root     22471  0.0  0.0 107948   352 pts/2    S+   20:43   0:00                      \_ sleep 5

ステップ1ではxorg.bashPIDは22471でしたが、ステップ2ではexec sleep 5同じPID 22471を持っています。

後ろに並ぶexec ...

このコマンドの機能execにより、現在のシェルは他の実行可能ファイルに置き換えられます。

   $ help exec
    ...
        Replace the shell with the given command.

したがって、xorg.bashその時点では、プロセスとして存在しなくなり、コマンドに置き換えられたexec ....ため、コマンドは実行されません。xorg.bashsleep

引用する

おすすめ記事