Bashスクリプトからプロセスを分離する方法は?

Bashスクリプトからプロセスを分離する方法は?

スクリプトを終了するときにSIGINTがプロセスに渡されないように、bashスクリプトからプロセスを分離しようとしています。

disown端末で直接コマンドを使用しましたが、bashではdisownSIGINTが渡されるのを防ぎませんでした。このスクリプトの目的は、単一の呼び出しでopenocdを起動し、gdbを起動することです。スクリプトが終了しないため(gdbを実行しているため)、SIGINTはまだgdbからopenocdに渡されます。これは、SIGINTがgdbで一時停止コマンドとして使用されるために問題になります。

端末では次のようになります。

$ openocd &    # run openocd demonized
$ disown $!    # disown last pid
$ gdb          # invoke GDB

この順序で端末から呼び出されると、SIGINTはgdbからopenocdに渡されません。ただし、同じ呼び出しがbashスクリプトにある場合、SIGINTが渡されます。

どんな助けでも大変感謝します。

ps この問題は OS X で発生しますが、すべての Unix ツールにも移植可能なツールを使用しようとしています。

ベストアンサー1

Bashスクリプトからプロセスを分離するには、次の手順に従ってください。

nohup ./process &

たとえば、(ctrl + c)を使用してbashスクリプトを停止したり、SIGINTシェルが終了した場合、SIGHUPプロセスは中断されずに正常に実行され続けます。stdout&はstderrログファイルにリダイレクトされますnohup.out

スタンドアロンコマンドの実行中に端末から出力を表示するには、次のようにしますtail

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./process &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &

おすすめ記事