2つのスクリプトがあります。
running_script
script_one
ユーザー名の下で実行されているrunning_script
のインスタンスのPIDを取得してから、pkill
を使用してrunning_script
およびドータープロセスを停止する必要があります。
私たちは次のようなものを期待しました:
ps -fu will | grep running_script
running_script
プロセスを検索します。ただし、psコマンドの出力に対してPIDをチェックすると、running_script
プロセスの(bin/bash)としてcmdが示されます。
running_script
は、&
を開始する分離プロセス(script_one
演算子)として実行されます。最初にPIDを印刷して、ps
コマンドの出力と比較します。
running_script &
echo $! -- $BASHPID
実際のユースケースでは、実行中の一部のrunning_script
プロセスのPIDはありません。また、script_one
は、running_script
親から切り離されたプロセスである場合とそうでない場合があります。
演習では、script_one
はループを実行します。
while [ true ]
do
echo " $0 - 35sec ..."
sleep 35
done
ただし、これは単なる例です。要件は、親のrunning_script
プロセスのPIDを取得することです。
ps
またはスクリプトファイルの名前とPIDを取得できる別のコマンドにオプションはありますか?または、検索できる名前を設定する方法?
最後のユースケースでは、running_script
のインスタンスがいくつか存在する可能性があるため、名前でそれらを選択することは、現在のところ最良のオプションのようです。
ps
コマンドが何を表示するかを表示すると役立つと思いました。ほとんどの応答は、うまくいくと思われるためです。この例は少し前に実行しました。
$ ./running_script &
$ echo $! - $BASHPID
9047 - 3261
$ ps -ef | grep will
UID PID PPID C STIME TTY TIME CMD
will 8862 2823 0 22:48 ? 00:00:01 gnome-terminal
will 8868 8862 0 22:48 ? 00:00:00 gnome-pty-helper
will 8869 8862 0 22:48 pts/4 00:00:00 bash
* will 9047 3261 0 22:55 pts/2 00:00:00 /bin/bash
will 9049 9047 0 22:55 pts/2 00:00:00 /bin/bash
will 9059 2886 0 22:56 pts/0 00:00:00 man pgrep
will 9070 9059 0 22:56 pts/0 00:00:00 pager -s
will 10228 9049 0 23:31 pts/2 00:00:00 sleep 35
will 10232 8869 0 23:31 pts/4 00:00:00 ps -ef
will 10233 8869 0 23:31 pts/4 00:00:00 grep --colour=auto william
私はPID#9047をマークしました、これは単に表示されます:-will 9047 3261 0 22:55 pts/2 00:00:00 / bin/bash
Linuxで設定できる「jobname」属性のようなものはありますか?
pgrep -f running_script
を試してください--fオプションは、プロセス名だけでなく、コマンドライン全体を使用して照合します。
ps -o pid,args -C bash | awk '/running_script/ { print $1 }'
これはps
を使用してすべてのbashプロセスのpidおよびargsを取得し、次にawkを使用して一致するプロセスのpid(フィールド1)を出力します。
ところで、ps -o pid,args -C bash
はpidと要求したスクリプトファイルの名前を提供します-スクリプトの名前はbash
コマンドの引数にあります。
ps
ではなくpgrep
を使用する場合は、異常に醜いps ... | grep -v grep | grep | awk
構成体ではなく、少なくともその全機能を使用してください。 grep
はパターン照合を実行できるため、最後のawk
は不要です。実際、awkはすべてを実行できるため、どちらのgrepsも必要ありません。ps ax | awk '! /awk/ && /myprocessname/ { print $1}'
ps - ef | grep -v grep | grep <script_name> | awk '{print $2}'
上記のコマンドは、script_nameのPIDを提供します。また、スクリプトで、実行中のPIDを含む一時ファイルを書き込むこともできます。
スクリプト内に行を追加します:echo $$>/tmp/script_pid.tmp