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

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

見たくない特定のプロセスを除いて、マイコンピュータで実行されているすべてのプロセスを一覧表示するオプションまたは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

答え2

一度マシンに乗ったら、どんなブートでも見ることができることを願っています。

あははは!したがって、寿命が短すぎるため、実行中のすべてのプロセスの単一の「スナップショット」によって、それを傍受する確率が非常に低いことを好むかもしれません。

したがって、どのプロセスが実行されているか見ないでください。、すべてのプロセスのログはどうですか?次から始まったログインしましたか?

bpftrace(多くのシステムにインストールされており、デフォルトではすべてのLinuxディストリビューションで利用可能です)が必要です。ファイルを実行してプロセスを開始するすべての試みを示す素晴らしいスクリプトは次のとおりです。

#!/usr/bin/bpftrace
// Taken from https://unix.stackexchange.com/a/584857/106650
// by Rui F Roberto CC-BY-SA 4.0
// Modified to log exec syscalls by Marcus Müller
BEGIN {
  printf("Tracing exec syscalls... Hit Ctrl-C to end.\n"); 
  printf("%-9s %-6s %-16s %s\n", "TIME", "PPID", "COMM", "EVENT");
}

tracepoint:syscalls:sys_enter_exec*
{
  time("%H:%M:%S ");
  printf("%-6d %s: ", pid, comm);
  join(args->argv);
}

きれいではありませんが、コピーして貼り付けたコード行は常に便利です。

bpftrace -e 'tracepoint:syscalls:sys_enter_exec* { printf("%-6d %s: ", pid, comm); join(args->argv); }'

1スペクトラムアナライザなどの分野での用語 - 非常に短い時間帯で「ポップ」する信号で、時には事前に不明であり、帯域を順番に調整する必要がある場合、信号を「捕捉」することは困難です。 「シグナルを送信して各スナップショットを撮影します。」したがって、シグナルセンサーは検出システムとクラス1のシグナルを見て、「ブロックの確率はわずか0.1%です」と言います。

答え3

返信するには、自分のコメントを切り替えてください。

  • 使用ps' startawk

特定の時間から1日の終わり(真夜中)までのすべてのプロセスを一覧表示するには、次の手順を実行します。

ps -eo pid,user,start,cmd | awk '$3>"17:40"'

特定の時間以降から翌日の終わり(翌日の深夜)までのすべてのプロセスを一覧表示するには、次の手順を実行します。

ps -eo pid,user,lstart,cmd | awk '$5>30 || $6>="17:40"'
#cons: will not work as you would like if the next day is the first day of next month.
  • 使用ps' pidawk

あまりスマートではありませんが、 :) まず、関心のあるプロセスの開始時間のpidを確認してからawk(ここでより良いsed方法でawk)フィルタリングすることができます。
特定の時間から最後のプロセスまで実行されているすべてのプロセスを一覧表示します(「特定の時間」と最後のプロセスの間に何時間/日があるかは関係ありません)。

ps -eo pid,user,lstart,cmd | awk '$1>=7895'

簡単な説明:

  • startand lstart- さらにbsdstartstart_timeand stime(最後の2つは私と同じように見えます。lstart最も長い時間形式を提供します。) -ps'コマンドの開始時間を表示するための標準形式指定子です。
  • '$3>"17:40"'-field 3超過が17:40ライン全体(レコード)を印刷する場合、デフォルトの動作は{print}明示的に入力する必要がないようにすることです。

関連情報