假设我使用以下命令运行该过程:
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
请注意,我已使用重定向输出>>
来附加到您的日志文件。