TTYを持たないプロセスを除いて、実行可能ファイル名でプロセスを検索しますか?

TTYを持たないプロセスを除いて、実行可能ファイル名でプロセスを検索しますか?

指定された実行可能ファイル名を持つプロセスを検索しようとしています。そして関連するTTYがあります。

マイユースケースは、実行中のクライアントプロセスを識別することですabducoabduco関連付けられたTTYを持つクライアントプロセスと関連付けられたTTYを持たないサーバープロセスを実行するので、それらを使用して2つを区別できます。

これまで私は2つの方法を考えました。私は走ることができます:

ps ao pid,comm | grep abduco

デフォルトでは(追加のオプションなしx)、関連するTTYを持つプロセスのみが考慮されます。

または、セクションps -Cを介してパイプする必要なしに実行可能ファイル名を使用してプロセスを選択できます。grepただし、これには関連するTTYを持たないプロセスが含まれ、psこの設定を変更するオプションはないようです。そのため、TTYを報告するプロセスをフィルタリングするためにいくつかの後処理を実行する必要がありました?

ps -C abduco o pid,tty

よりクリーンなソリューションはありますか?

ベストアンサー1

各システムには、ps独自の構文と機能を持つ独自のコマンドがあります。

POSIXはコマンドを指定しますpsが、多くのオプションはオプションです。

使用するオプションは標準ではありません。ps aoBSDスタイルの構文で、ps -CHP / UXオプションです。さまざまな実装の機能をps組み合わせようとしているので、procps実装を使用する必要があります。ps

それにもかかわらず、与えられた名前でプロセスを報告し、ttyを制御するように指示する方法がわかりません。

したがって、後処理が必要です。

ps -o pid= -o tty= -C abduco | awk '$2 != "?" {print $1}'

とにかく、-C "$string"実際の実行可能ファイル名ではなくプロセス名と一致するように注意してください。 Linuxでは、プロセス名はプロセスの属性である最大15バイトの文字列です。親プロセスから継承され、execve()プロセスがシステムコールを実行するたびに変更されます。この場合、プロセス名は渡されたファイルパスのデフォルト名の最初の15バイトに変更されますexecve()(したがって、この意味では、実行ファイル名)またはprctl(PR_SET_NAME)電話で(まれですが)。

/proc/<pid>/exeプロセスが実行されているコードの実行可能ファイルを一致させるには、シンボリックリンク(Linuxの場合)を確認する必要があります。

たとえば、次のようになりますzsh

print -rC1 -- /proc/*/exe(e['[[ $REPLY -ef =bzip2 ]]']:h:t)

コマンドを実行するプロセスのpidを報告します(bzip2シンボリックリンクが解決された後にファイルが/proc/pid/exe最初に表示されるのと同じです)。bzip2$PATH

ttyを持つユーザーにのみ制限されます。

() {
  print -rC1 -- /proc/$^@/exe(e['[[ $REPLY -ef =bzip2 ]]']:h:t)
} $(ps ao pid=)

ただしbzip2bunzip2bzcatはすべて同じファイルなので、実行可能ファイルの一致はプロセス名の一致よりも実際にはあまり役に立ちません。コマンドがbzip2またはを呼び出すbunzip2プロセスを区別しないためですbzcat

別名圧縮/圧縮解除/bzcatかどうかを決定するために、基本名を見てください。厳密に言えば、bzcatこれは私たちが一致させたいもの(Linuxで発見)でなければなりませんが、おそらく99%以上の時間を費やす価値はありません。 nameは渡された実行可能ファイルのデフォルト名と同じです(切り捨てられませんが)。bzip2bunzip2argv[0]/proc/pid/cmdlineargv[0]execve()

おすすめ記事