コマンドライン引数の代わりに長いコマンド名のプロセスIDのリストを取得するにはどうすればよいですか?

コマンドライン引数の代わりに長いコマンド名のプロセスIDのリストを取得するにはどうすればよいですか?

pgrep -fpgrepのプロセス名の長さは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.shvi my_long_script_name.sh

pgrep -d ' 'パラメータリストではなくプロセス名のみに基づいてプロセスIDリストを取得するにはどうすればよいですか?リストからそのプロセスを終了するか、同じ方法で作成できますか?

Busterを実行していますが、Wh​​eezyなどの古い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/commLinux)Linuxは最大15バイト長で、親プロセスから継承され、プロセスがexecve()実行されているファイルのデフォルト名の最初の15バイトに対してシステムコールを行うたびに変更されます。値を入力するprctl()か、ファイルに書き込むcomm)。

これがなく、または一緒に報告された内容ですps。そして基本的に一致するものは何ですか?-f-o commpgrep

もありますパラメータリスト/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そのプロセスを終了するには、次のようにパイプします。

おすすめ記事