web-dev-qa-db-ja.com

bash-スクリプトファイル名を使用してスクリプトのpidを取得する

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」属性のようなものはありますか?

10
will

pgrep -f running_scriptを試してください--fオプションは、プロセス名だけでなく、コマンドライン全体を使用して照合します。

13
glenn jackman

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}'

4
cas
ps - ef | grep -v grep | grep <script_name> | awk '{print $2}'

上記のコマンドは、script_nameのPIDを提供します。また、スクリプトで、実行中のPIDを含む一時ファイルを書き込むこともできます。

スクリプト内に行を追加します:echo $$>/tmp/script_pid.tmp

1
ObiWanKenobi