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

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

2つのスクリプトがあります。

  • running_script
  • script_one

ユーザー名で実行されているすべてのインスタンスのPIDを取得し、サブプロセスを停止する必要がrunning_scriptありpkillます。running_script

私たちが期待するものは次のとおりです。

ps -fu will | grep running_script

running_scriptプロセスを見つけてください。ただし、psコマンドの出力についてPIDを確認すると、次のようになります。ガイドライン例: プロセスの "bin/bash running_script"

running_script開始された独立プロセス(&オペレータ)として実行されますscript_onepsコマンドの出力と比較するために、最初にPIDを印刷します。

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

aaに似ていますか?」役職「Linuxでプロパティを設定できますか?

答え1

pgrep -f running_scriptプロセス名だけでなくコマンドライン全体を一致させるには、--fオプションを試してください。

答え2

ps -o pid,args -C bash | awk '/running_script/ { print $1 }'

psこれは、すべてのbashプロセスのpidとargsを取得し、awkを使用して一致するプロセス(フィールド1)のpidを印刷するために使用されます。

さて、ps -o pid,args -C bashリクエストしたスクリプトファイルのpidと名前を教えてください。スクリプト名はcommandの引数にありますbash

psあなたがそれを使用している場合は、少なくとも非常にpgrep見苦しい構造ではなく、完全な機能を使用してくださいps ... | grep -v grep | grep | awk。パターンマッチングを実行できるため、最後の項目はgrep必要ありません。awk実際、awkがすべてを行うことができるので、grepも必要ありません。ps ax | awk '! /awk/ && /myprocessname/ { print $1}'

答え3

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

上記のコマンドはscript_nameのPIDを提供します。また、スクリプトが実行されているPIDを使用して一時ファイルにスクリプトを書き込むこともできます。

保存する現在のPID、スクリプトに次の行を追加します。

echo $$>/tmp/script_pid.tmp

答え4

#!/bin/bash

# pidofargs.sh
# get process id by first argument of a process
# using `ps -eo pid,args` and `read -a`

# sample use: pidofargs.sh python /usr/bin/youtube-dl

search_grep="$1" # first filter
search_arg1="$2" # second filter

# first filter
ps -eo pid,args | grep "$search_grep" | while read pid args
do
  read -a arg < <(echo "$args")

  # pid    = process id
  # arg[0] = executable file of process
  # arg[1] = first argument of process

  # second filter
  if [[ "${arg[1]}" == "$search_arg1" ]]
  then
    # success
    echo $pid
    break
  fi

done

関連情報