これらの特定のプロセスを除くすべてのプロセスを見つける

これらの特定のプロセスを除くすべてのプロセスを見つける

見たくない特定のプロセスを除いて、マイコンピュータで実行されているすべてのプロセスを一覧表示するオプションまたはps標準的な方法はありますか?pgrep

つまり、4つのプロセスが実行されているとしましょう。

% ps
PID   TTY        TIME    CMD
26712 ttys000    0:00.45 -zsh
28228 ttys001    0:00.23 -zsh
42083 ttys002    0:00.11 -zsh
42396 ttys002    0:00.16 node

一部のプロセスIDを含むテキストファイルがあります。

% cat /tmp/no-interest.txty 
26712
28228

表示されるコマンドライン呼び出しが必要です。ただ42083および42396のプロセス情報。

私が解決したいより一般的な問題は、特定の時点以降に開始されたプロセスを表示したいことです。現在実行中のプロセスのリストをテキストファイルとして作成できますが、この情報を使用して表示したくないプロセスを隠すためのきちんとした方法を見つけるのは少し混乱しています。私はさまざまな言語のショートプログラムでこれを行う方法を知っていますが、デバッグしている特定のコンピュータにそのプログラムを配置することを心配することなく、1行のプログラムで呼び出すことができることを望みます。

ベストアンサー1

ps | grep -vFwf /tmp/no-interest.txty

psで単語で区切られた行を含む行をフィルタリングします/tmp/no-interest.txty。しかし、pidフィールドだけでなく、どこでもその項目を探します。

シェルがzshのように見えるので、pspidリストを引数として受け入れると、zshの配列減算演算子を使用することもできます。

to_exclude=( $(</tmp/no-interest.txty) )
all_pids=( $(ps -o pid=) )
ps -p ${all_pids:|to_exclude}

または匿名関数を使用してください。

to_exclude=( $(</tmp/no-interest.txty) )
() { ps -p ${@:|to_exclude}; } $(ps -o pid=)

$(</tmp/no-interest.txty)このファイルの内容を文字ごとに分割します$IFS。また、${(f)"$(</tmp/no-interest.txty)"}ファイル内の空でない行をすべて確認してください。

それにもかかわらず、PID番号は最終的にラップされるので、PID番号に依存して開始された順序を知ることはできません。

一部のps実装では、次のものを使用できます。

ps -o lstart

2番目の精度でプロセスの開始時間を取得します(Tue Jan 31 06:05:22 2023私のシステムはロケールに関係なく;psの形式を使用しますprocps-ng)。 C ロケールに組み込まれた関数を使用してzsh解析できます。strftime

zmodload zsh/datetime
(( cutoff = EPOCHSECONDS - 2*60*60 )) # two hours ago
pids=()
ps -o pid= -o lstart= |
  while read -r pid start; do
    LC_ALL=C strftime -rs t '%a %b %d %H:%M:%S %Y' $start &&
      (( t >= cutoff )) &&
      pids+=( $pid )
  done
(( $#pids )) && ps -p $pids

さらに、プロセスは、プロセス(または親プロセスの1つ)が現在実行中のコマンドを呼び出すと同時に開始される必要はありません。プロセスは、寿命の間に複数のコマンドを実行でき、しばしば実行するためです。

たとえば、 、 then 、 then (対話型シェルの子プロセスで始まった可能性があります) を実行するsh -c 'sleep 2; exec env cmd'同じプロセスで 。shenvcmd

おすすめ記事