我想跟踪现有进程,尤其是它们的参数(如环境变量、cwd 目录、stdout 等)。我能做到。但是,我无法获得有关短期流程的信息)。例如:
如果我运行:
sleep 120 &
# get info from /proc/`pgrep sleep`
Run Code Online (Sandbox Code Playgroud)
这很容易。
但是,如果我的进程立即终止或者我不知道进程的 PID(但我希望会创建一些进程)怎么办。
小智 3
您必须使用proc 连接器forkstat(1)
接口或其他一些程序。不幸的是,您只能以 root 身份执行此操作。另外,它不可扩展或可编写脚本,因此如果您还希望它打印进程的环境、其控制 tty 等,您可能必须编写自己的程序,将 proc 连接器中的数据与 from 中的数据结合起来。forkstat(1)
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";
}
'
Run Code Online (Sandbox Code Playgroud)
作为普通用户,您唯一的解决方案是运行父进程,通过以下方式启动这些短期进程(或其祖先之一):
strace -s1024 -vfe trace=execve prog args ...
Run Code Online (Sandbox Code Playgroud)
该选项控制将打印-s
多少 argv 和 env 字符串。strace
通过运行程序strace
可能会对性能产生相当大的影响。可能还有其他更友好/可编写脚本的替代方案strace(1)
,但ptrace(2)
如果普通用户要使用它们,则它们都必须使用,因此不要期望它们有本质上的不同。