見たくない特定のプロセスを除いて、マイコンピュータで実行されているすべてのプロセスを一覧表示するオプションまたは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のように見えるので、ps
pidリストを引数として受け入れると、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'
同じプロセスで 。sh
env
cmd
答え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' start
とawk
特定の時間から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' pid
とawk
あまりスマートではありませんが、 :) まず、関心のあるプロセスの開始時間のpidを確認してからawk
(ここでより良いsed
方法でawk
)フィルタリングすることができます。
特定の時間から最後のプロセスまで実行されているすべてのプロセスを一覧表示します(「特定の時間」と最後のプロセスの間に何時間/日があるかは関係ありません)。
ps -eo pid,user,lstart,cmd | awk '$1>=7895'
簡単な説明:
start
andlstart
- さらにbsdstart
、start_time
andstime
(最後の2つは私と同じように見えます。lstart
最も長い時間形式を提供します。) -ps'
コマンドの開始時間を表示するための標準形式指定子です。'$3>"17:40"'
-field
3
超過が17:40
ライン全体(レコード)を印刷する場合、デフォルトの動作は{print}
明示的に入力する必要がないようにすることです。