短期プロセスに関する情報の取得

短期プロセスに関する情報の取得

既存のプロセス、特にそのパラメータ(環境変数、cwdディレクトリ、stdoutなど)を追跡したいと思います。私はできる。ただし、短期プロセスに関する情報は取得できません。)例えば:

私が実行した場合:

sleep 120 & 
# get info from /proc/`pgrep sleep` 

それは簡単です。

しかし、私のプロセスがすぐに終了した場合、またはプロセスのPIDがわからない場合(しかし、いくつかのプロセスが生成されると予想される場合)はどうすればよいですか?

答え1

一般ユーザーの1つのアプローチは、プログラムが検索を介して実行されるとexec仮定するラッパーですPATH。つまり、program

#!/bin/sh
env > /some/log/file
... (any other desired logging commands here) ...
exec /path/to/real/program "$@"

に最初に存在する必要があるため、記録したい実際の名前と正確に一致する名前のラッパーをPATH持つことができ、ラッパー内でラッパーを元の名前に置き換えることができます。プログラムが完全修飾パスを介して実行されている場合は、同様のものを調整する必要があり、関連するアプリケーションがパスを変更するオプションを提供できます。PATH=/some/wrapper/dir:$PATHprogramprogramprogramprogramexecLD_PRELOAD

なぜならrootsysdigさまざまなsysdigの例ls)関心のある一時プロセス名と一致し、プログラムが特定のユーザーとして実行されていると仮定すると、興味のある項目にドリルダウンできるためです。

sudo sysdig "proc.name = ls and user.name = jhqdoe" | tee log

やや長いファイルを実行すると、必要なほとんどlogすべてを提供する項目が表示されます(環境は切り捨てられます)。lsexecve

9734 16:12:49.683389228 1 ls (20542) < execve res=0 exe=ls args=--color=auto. tid=20542(ls) pid=20542(ls) ptid=20052(bash) cwd= fdlimit=1024 pgft_maj=0 pgft_min=61 vm_size=404 vm_rss=4 vm_swap=0 comm=ls cgroups=cpuset=/.cpu_cgroup=/.cpuacct=/.mem_cgroup=/.devices=/user.slice.freezer=/.ne... env=XDG_SESSION_ID...

渡すユーザーマニュアルexecveその他の文書では、上記の内容は、呼び出しと表示の完全なコンテキストまで正確である可能性があります。

sudo sysdig -p "%proc.env" "proc.name = ls and user.name = jhqdoe and evt.type = execve" | tee xxx

-p必要な内容を表示するように調整してください。ドラッグを使用して、リアルタイムのキャプチャや保存されたファイルなどから目的のコンテンツを抽出することもできます。

答え2

使用する必要がありますforkstat(1)それとも別のプログラムを使用していますかプロセスコネクタ相互作用。残念ながら、これはrootとしてのみ実行できます。また、スケーラブルまたはスクリプト可能ではないため、プロセス環境、制御ttyなども印刷するには、forkstat(1)procコネクタのデータとprocコネクタのデータを組み合わせる独自のプログラムを作成する必要があります。から。procfs

forkstat(1)以下は、バイナリの実際のパスとプロセスの現在のディレクトリを印刷する非常に粗い「拡張」方法ですexecve

stdbuf -o0 forkstat -e fork,exec | perl -anle '
  print;
  if($F[1] eq "exec"){
     print "\texe = ", readlink "/proc/$F[2]/exe";
     print "\tcwd = ", readlink "/proc/$F[2]/cwd";
  }
' 

一般ユーザーとしての唯一の解決策は、これらの短期プロセス(またはその親プロセスの1つ)を開始する親プロセスを実行することです。

strace -s1024 -vfe trace=execve prog args ...

この-sオプションは、印刷する文字列argvとenvを制御しますstrace。プログラムを実行すると、straceパフォーマンスに大きな影響を与える可能性があります。よりユーザーフレンドリーでスクリプト可能な他の選択肢があるかもしれませんが、strace(1)通常のユーザーが使用するにはすべて使用する必要があるため、基本的に異なるとは思わないでください。ptrace(2)

関連情報