Bashを使用したSTDIN注入のための対話型プロセスラッピング

Bashを使用したSTDIN注入のための対話型プロセスラッピング

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です。quitbc4771expectbc

別のオプションは、ioctlを使用してTIOCSTI現在の端末に行を挿入することです。quitただし、これはシェルでは実行できず、まだ小さなC(またはPerl、Pythonなど)プログラムが必要です。呼び出しますioctl()TIOCSTIすでにOpenBSDではシステムから削除されます)。

おすすめ記事