SIGTERMを完全に無視するゲームサーバープログラム(SRCDS)を実行しています。サーバーを完全にシャットダウンする唯一の方法は、インタラクティブに「quit」と入力することです。
SIGTERMをキャプチャしてプログラムのSTDINに「終了」を送信するbashスクリプトでこのプログラムをラップする方法はありますか?それ以外の場合、通常の操作では、ラッパーはSTDINとSTDOUTがまったく存在しないかのように渡す必要があります。
私が達成したい目標の図:
一般外科:
--- STDIN ---> | | --- STDIN ---> | |
| Bash Script | | Server Program |
<-- STDOUT --- | | <-- STDOUT --- | |
SIGTERMは以下を送信します。
"quit"
--- STDIN ---> | | --- STDIN ---> | |
-- SIGTERM --> | Bash Script | | Server Program |
<-- STDOUT --- | | <-- STDOUT --- | |
ベストアンサー1
プログラムが端末で実行されると予想されるかどうかによって異なります。もしそうなら、これはできませんbash
。同様のものを使用する必要がありますexpect
。例:
ラッパー。予想:
puts "<<< pid=[pid] >>>"
spawn {*}$argv
trap {send "quit\n"} SIGTERM
interact
BCを例に挙げましょう。
expect wrapper.expect bc -q
<<< pid=4771 >>>
spawn bc -q
kill 4771
別のウィンドウでAを使用すると、行がexpect
に転送されます。これは子プロセスのpidではなくプロセスのpidです。quit
bc
4771
expect
bc
別のオプションは、ioctlを使用してTIOCSTI
現在の端末に行を挿入することです。quit
ただし、これはシェルでは実行できず、まだ小さなC(またはPerl、Pythonなど)プログラムが必要です。呼び出しますioctl()
(TIOCSTI
すでにOpenBSDではシステムから削除されます)。