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_one
。ps
コマンドの出力と比較するために、最初に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