バックグラウンドで実行されているbashシェルスクリプトの終了

バックグラウンドで実行されているbashシェルスクリプトの終了

私は多くの場合、bashさまざまなファイルに対して単純なコマンドを実行するためにシェルスクリプトを使用します。たとえば、bash3つのテキストファイルでscript.shプログラム/コマンドを実行する次のシェルスクリプトがあるとします。foo"a.txt""b.txt""c.txt"

#!/bin/bash

for strname in "a" "b" "c"
do
foo $strname".txt"
done

また、速度foo $strname".txt"が遅いと仮定すると、スクリプトの実行に長い時間がかかります(例:数時間または数日)。したがって、nohupターミナルが閉じているか接続が切断されても実行が続く方法を使用したいと思います。また、スクリプトがすぐにバックグラウンドに移動したいので、演算子を使用します&。したがって、次のコマンドを使用して呼び出しますscript.sh

nohup bash script.sh &

これはバックグラウンドでスクリプトを実行して中断されないようにするのに効果的ですが、何らかの理由で何らかの時点で実行を終了したいとしましょう。どうすればいいですか?

私が経験している問題は、を見ると、対応する項目だけが表示されることtopです。その呼び出しを終了できますが、その呼び出しが呼び出されると、その呼び出しも終了する必要がある式です。ループに数十または数百のテキストファイルが指定されている場合は、各ファイルを1つずつ終了するのが痛いです。だから何とかシェルスクリプトを終了する必要がありますfoo"a.txt"foofoo"b.txt"forfooそれ自体、いいえ特別なシェルスクリプトで行われた呼び出しです。

コマンドを入力すると

ps -u myusername

私のユーザー名はどこにあり、myusername実行中のプロセスのリストが表示されます。ただし、という2つの異なるプロセスIDが表示されますbash。これらのプロセスのうち、どのプロセス(存在する場合)が元の呼び出しに対応するのかどうかはどうすればわかりますかnohup bash script.sh &

答え1

いくつかのオプションがあります。プロセスはバックグラウンドで実行されているため、次のコマンドを使用してjobs見つけることができます。

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

pkillコマンドライン一致に対してプロセステーブル検索を使用することもできます。

pkill -f script.sh

答え2

デフォルトでは、psプログラムの呼び出しに使用されたパラメーターは表示されません。オプション-f-lその両方が通話全体を表示します。

ps -fu username

以下のように出力が生成されます。

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

答え3

出力ps(例:)ps auxには、親プロセスのプロセスIDが含まれています。親プロセスを終了すると、その子bashプロセスも終了します。

プロセスツリーのASCII可視化のためにpstree -pいくつかのバックグラウンドプロセスを実行してみてください。

関連情報