Команда, с которой был запущен процесс

8

Предположим, я запустил процесс с помощью следующей команды:

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

Через некоторое время я только pidв myappпроцессе, например , 1234. Есть ли способ , чтобы получить команду со всеми флагами и перенаправив вывод myapp.logкак - то просто pid?

user3663882
источник

Ответы:

10
ps -o args= -p "$pid"

Скажет вам список аргументов, предоставленный последней команде, выполненной процессом (или, если он не выполнил ни одной, той, которую выполнил родительский процесс ...), при условии, что процесс впоследствии не переопределит свой список аргументов.

psпокажет, что список аргументов объединен с пробелами и до предела, который вы можете увеличить в некоторых psреализациях, добавив пару -wопций). В Linux вы можете увидеть arglist, разделенный байтами NUL /proc/$pid/cmdline.

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

Расскажет, на что указывают файловые дескрипторы процесса stdin, stdout и stderr и каков режим, в котором они были открыты (например, только W,APдля записи с добавлением, как если бы >>перенаправление использовалось в оболочке POSIX).

Стефан Шазелас
источник
+1 за использование lsofдля определения того, что процесс перенаправляется вmyapp.log
joeytwiddle
1
Другой способ найти выходной файл:readlink /proc/$pid/fd/1
joeytwiddle
Аааа, я думал, что 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

Обратите внимание, что я перенаправил вывод, используя >>для добавления в ваш файл журнала.

Arronical
источник
Для устранения строки заголовка tail -n+1(требуется GNU, но Q был Linux / Ubuntu). Или избежать проблемы с ps -h{f,l}p 1234(также GNU).
dave_thompson_085
@ dave_thompson_085 спасибо, я знал, что есть возможность удалить заголовок, но не прокручивал достаточно далеко вниз по странице руководства. tail -n1безусловно работает на Ubuntu, зачем это +нужно?
Arronical
Я думаю, что Дейв хотел предложить, 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 .

Harshit
источник
1
Разве это не выводит детали команды grep?
Arronical
2
@ Arronical Да, ты прав. Вы можете избежать этого, исключив команду grep:ps -ef | grep 'foo' | grep -v grep
maulinglawns
@maulinglawns, это то, что я сделал бы, если бы пошел по маршруту grep, также имеет преимущество удаления заголовка.
Arronical
Чтобы избежать этого, grep -vя использую этот трюк:grep '123[4]'
joeytwiddle