私の問題は次のとおりです。呼び出し時にコマンドライン引数を追加する小さなラッパースクリプトを作成しようとしています。呼び出し側がUSR1
Xorgのシグナルを待っています。 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/他のスクリプト言語でこれは可能ですか?いくつかの理由でソリューションのコンパイルを避けたいのですが、不可能なことではありません。これが完全に間違っていると考えることも可能であり、USR1
Xorgで発信者に連絡する他の方法があります。
答え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
次のような結果を見ることができます。
$ 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.bash
PIDは22471でしたが、ステップ2ではexec sleep 5
同じPID 22471を持っています。
後ろに並ぶexec ...
このコマンドの機能exec
により、現在のシェルは他の実行可能ファイルに置き換えられます。
$ help exec ... Replace the shell with the given command.
したがって、xorg.bash
その時点では、プロセスとして存在しなくなり、コマンドに置き換えられたexec ....
ため、コマンドは実行されません。xorg.bash
sleep