已知进程的 PID,怎么知道他执行的命令及其参数呢?

Linux 下可以执行 cat /proc/[pid]/cmdline 来查看。例如:

$ cat /proc/116860/cmdline
/home/xyz/.conda/envs/paddle/bin/python-utools/train.py-cconfigs/ppyolo/ppyolov2_r50vd_dcn_lmdb.yml--eval--use_vdl=1--vdl_log_dir=../../../workspace/paddle-det/ppyolov2_r50vd_dcn_lmdb/vdl

看上去参数全连在一起,没有分开。这其实是 cat 的问题,实际是以 \0 分隔参数的。增加 -v 参数可以看到:

$ cat -v /proc/116860/cmdline
/home/xyz/.conda/envs/paddle/bin/python^@-u^@tools/train.py^@-c^@configs/ppyolo/ppyolov2_r50vd_dcn_lmdb.yml^@--eval^@--use_vdl=1^@--vdl_log_dir=../../../workspace/paddle-det/ppyolov2_r50vd_dcn_lmdb/vdl^@

我们可以通过 tr 命令将 \0 替换成空格。如:

$ cat /proc/116860/cmdline | tr '\0' ' '
/home/xyz/.conda/envs/paddle/bin/python -u tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_lmdb.yml --eval --use_vdl=1 --vdl_log_dir=../../../workspace/paddle-det/ppyolov2_r50vd_dcn_lmdb/vdl 

也可以通过 strings 命令将参数分隔成单独的行。如:

$ cat /proc/116860/cmdline | strings -1
/home/xyz/.conda/envs/paddle/bin/python
-u
tools/train.py
-c
configs/ppyolo/ppyolov2_r50vd_dcn_lmdb.yml
--eval
--use_vdl=1
--vdl_log_dir=../../../workspace/paddle-det/ppyolov2_r50vd_dcn_lmdb/vdl

How to parse /proc/pid/cmdline

发表回复

您的电子邮箱地址不会被公开。