
pgrep -f
pgrepのプロセス名の長さは15文字に制限されているため、コマンドを実行するときは常に長い名前のプロセスIDのリストを使用しました。ただし、これには誤った結果を与える完全なコマンドライン引数が含まれています。
例:my_long_script_name.sh
それが実行されていると私はvi my_long_script_name.sh
(今は実行中のプログラムの編集を無視する)としましょう。
実行すると、プロセスIDとpgrep -f my_long_script_name.sh
プロセスIDが返されます。my_long_script_name.sh
vi my_long_script_name.sh
pgrep -d ' '
パラメータリストではなくプロセス名のみに基づいてプロセスIDリストを取得するにはどうすればよいですか?リストからそのプロセスを終了するか、同じ方法で作成できますか?
Busterを実行していますが、Wheezyなどの古いOSでも同じ問題が発生します。要求どおりに実行したら、sed -n l "/proc/$pid/comm"
私のターミナルセッションは$pid
どこに$BASHPID
ありますかbash$
?私が走るとsed -n l "/proc/$pid/cmdline"
私はそれを得るでしょう-bash\000$
。その後、1の代わりに小文字のLが続きます-n
。実行するとcat -vte
停止します。
答え1
問題はそうではありません。長いプロセス名。
一部はプロセス名(/proc/pid/comm
Linux)Linuxは最大15バイト長で、親プロセスから継承され、プロセスがexecve()
実行されているファイルのデフォルト名の最初の15バイトに対してシステムコールを行うたびに変更されます。値を入力するprctl()
か、ファイルに書き込むcomm
)。
これがなく、または一緒に報告された内容ですps
。そして基本的に一致するものは何ですか?-f
-o comm
pgrep
もありますパラメータリスト/proc/pid/cmdline
(Linuxの場合)プロセスは最後に実行されたコマンドを渡しました。通常、最初の引数は実行中のファイルのデフォルト名またはパスです。
ps -f
あるいは、ps -o args
これらの引数を空白文字に関連付けて印刷し、結果のpgrep -f
文字列と一致させます。この接続により、各パラメータが開始および終了する場所に関する情報が失われます。
ただし、最初の引数に空白文字が含まれていないと仮定できる場合は、最初の引数に次のものを含むmy_long_script_name.sh
プロセスを引き続き一致させることができます。
pgrep -f '^[^ ]*my_long_script_name\.sh'
pgrep
(置換)そのプロセスを終了するには。pkill
安定性を高めるために、Linuxではzsh
次のことができます。
print -C1 /proc/<->(Ne[$'[[ ${"$(<$REPLY/cmdline)"%%\0*} = (*/|)my_long_script_name.sh ]]']:t)
つまり、/proc/pid/cmdline
引数が区切られた場所から直接情報を取得し、$'\0'
最初の引数に続く部分がまたはで$'\0'
終わるmy_long_script_name.sh
かどうかを確認します/my_long_script_name.sh
。
xargs kill
そのプロセスを終了するには、次のようにパイプします。