Предположим, я запустил процесс с помощью следующей команды:
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
покажет этот список аргументов, объединенный пробелами и до предела, который вы можете увеличить в некоторых ps
реализациях, добавив несколько -w
опций). В Linux вы можете увидеть список аргументов, разделенный байтами NUL в /proc/$pid/cmdline
.
lsof +fg -ap "$pid" -d 0-2
Сообщит вам, на что указывают файловые дескрипторы процесса stdin, stdout и stderr, а также режим, в котором они были открыты (например, W,AP
для режима «только запись» с добавлением, как если бы >>
перенаправление использовалось в оболочке POSIX).
решение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.