指定された実行可能ファイル名を持つプロセスを検索しようとしています。そして関連するTTYがあります。
マイユースケースは、実行中のクライアントプロセスを識別することですabduco
。abduco
関連付けられた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 ao
BSDスタイルの構文で、ps -C
HP / 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=)
ただしbzip2
、bunzip2
とbzcat
はすべて同じファイルなので、実行可能ファイルの一致はプロセス名の一致よりも実際にはあまり役に立ちません。コマンドがbzip2
またはを呼び出すbunzip2
プロセスを区別しないためですbzcat
。
別名圧縮/圧縮解除/bzcatかどうかを決定するために、基本名を見てください。厳密に言えば、bzcat
これは私たちが一致させたいもの(Linuxで発見)でなければなりませんが、おそらく99%以上の時間を費やす価値はありません。 nameは渡された実行可能ファイルのデフォルト名と同じです(切り捨てられませんが)。bzip2
bunzip2
argv[0]
/proc/pid/cmdline
argv[0]
execve()