私は多くの場合、bash
さまざまなファイルに対して単純なコマンドを実行するためにシェルスクリプトを使用します。たとえば、bash
3つのテキストファイルで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"
foo
foo
"b.txt"
for
foo
それ自体、いいえ特別なシェルスクリプトで行われた呼び出しです。
コマンドを入力すると
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
いくつかのバックグラウンドプロセスを実行してみてください。