运行进程的命令


8

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

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

过了一会儿,我只有pidmyapp过程中,如1234有没有办法让所有标志的命令和输出重定向到myapp.log通过某种方式只pid

Answers:


10
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对于只写带有append的情况,就像>>在POSIX shell中使用了重定向一样)。


+1用于lsof检测进程是否正在重定向到myapp.log
joeytwiddle

1
查找输出文件的另一种方法是:readlink /proc/$pid/fd/1
joeytwiddle

Aaah,我以为OP是进程标志,而不是命令及其选项的打印输出!好答案。
Arronical

4

您可以使用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

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


消除标题行tail -n+1(需要GNU,但Q是Linux / Ubuntu)。或避免使用ps -h{f,l}p 1234(也是GNU)问题。
dave_thompson_085 '16

@ dave_thompson_085谢谢,我知道有一个选项可以删除标题,但没有在手册页上滚动足够远。tail -n1绝对可以在Ubuntu上运行,为什么有+必要?
Arronical

我认为dave打算建议tail -n+2显示除第一行以外的所有行。tail -n1仅显示最后一行。比较:seq 1 10 | tail -n+2等等。
joeytwiddle

1
@joeytwiddle啊,现在我知道了,我对其进行了编辑以包括他的建议,-h因为这样可以避免不必要的管道和额外的过程。
Arronical

1

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

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

请检查此ps手册页


1
这还会输出grep命令的详细信息吗?
Arronical

2
@Arronical是的,您是对的。您可以通过排除grep命令来避免这种情况:ps -ef | grep 'foo' | grep -v grep
maulinglawns

如果我沿着grep路线走,@ maulinglawns就是我要做的,它也具有删除标头的好处。
Arronical

为了避免grep -v我使用这个技巧:grep '123[4]'
joeytwiddle16年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.