运行进程所使用的命令

运行进程所使用的命令

假设我使用以下命令运行该过程:

myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1

一段时间后,我只有pid进程myapp,例如 1234。有没有办法获取带有所有标志的命令并将输出重定向到myapp.log某种方式pid

答案1

ps -o args= -p "$pid"

将告诉您为进程执行的最后一个命令提供的参数列表(或者如果它没有执行任何命令,则其父级执行的命令...),前提是该进程随后没有覆盖其参数列表。

ps将显示与空格连接的 arg 列表,并且达到一个限制,您可以ps通过添加几个-w选项来通过某些实现来提高该限制)。在 Linux 上,您可以在 中看到由 NUL 字节分隔的 arglist /proc/$pid/cmdline

lsof +fg -ap "$pid" -d 0-2

将告诉您进程的 stdin、stdout 和 stderr 文件描述符指向什么以及它们打开的模式(例如W,AP带有附加的只写,就像>>在 POSIX shell 中使用重定向一样)。

答案2

您可以使用该ps命令,并指定要使用开关检查的 pid -p,使用-f开关给出完整列表,或-l更详细的长列表。

作为输出的示例:

$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0 31441 31319  0  80   0 -  1423 hrtime pts/3    00:00:00 sleep
$ ps -fp 31441
UID        PID  PPID  C STIME TTY          TIME CMD
root     31441 31319  0 10:44 pts/3    00:00:00 sleep 60

但是,这会输出一个标题行,您可能不希望在日志文件中出现该标题行。-h如果你的 pid 是 1234,你可以使用以下选项来修剪它:

ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1

请注意,我已使用重定向输出>>来附加到您的日志文件。

答案3

使用ps -f您可以检查参数列表,也可以将其重定向到任何文件。

所以,在这种情况下只需使用ps -ef | grep 1234 > myapp.log

请检查这个ps 手册页

相关内容