Трассировка вызова Linux Bash

Трассировка вызова Linux Bash

Мне было интересно, есть ли способ отследить, откуда была запущена команда в Linux.

Например, если я вызываю скрипт, есть ли способ отследить, откуда он был вызван, например, запущен ли он из программы или другого скрипта bash?

решение1

Если ваш скрипт написан на bash, то есть встроенная переменная $PPID (сокращение от parent's process ID, я полагаю), которую вы можете использовать, чтобы узнать, кто вызвал ваш скрипт. Вот пример:

CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER

Объяснение:

  1. $PPID содержит идентификатор родительского процесса (вызывающего).
  2. the пскоманда выводит список всех процессов
  3. Theгрэпкоманда ищет строку, содержащую PPID в начале строки
  4. Theawkкоманда выводит только последний столбец, который является именем вызывающего

решение2

"Был«запустить из» довольно сложно, я думаю, если только в исполняемом файле, который был запущен, не ведется какой-либо журнал. Если выполнение завершено, то, вероятно, не так уж много остается для изучения.

Если оноявляетсявыполняется, вы можете получить достаточно информации о вызывающем объекте из идентификатора родительского процесса (PPID), просто используя ps.

решение3

Если процесс все еще выполняется, вы можете использовать иерархическую визуализацию (также называемую лесом или деревом процессов), предлагаемую командой ps.

Попробуйте, например:

ps xf

И вывод будет выглядеть так:

 3627 ?        Ss     0:00 /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
 3655 ?        S      0:38  \_ bwm --interface eth0 --download
 3656 ?        S      0:38  \_ bwm --interface eth0 --upload
 3687 ?        S      0:20  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
  574 ?        S      0:00  |   \_ sleep 1
 3713 ?        S      0:00  \_ wmiir read /event
 3714 ?        S      0:00  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22671 ?        S      0:00      \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22672 ?        Ss     0:03          \_ xterm
22673 pts/0    Ss+    0:00              \_ bash

решение4

Возможное улучшение ответа Хай Ву:

ps -p $PPID -o args=

Ограничивает -pвывод psидентификатором процесса родителя. Позволяет -oвам указать свой собственный вывод, и в этом случае у меня есть args=which (для меня это то, что я ищу). Возможным обновлением является то, что вместо получения большого количества информации и последующей попытки ее анализа вы запрашиваете только psту информацию, которая вам нужна.

После этого $PPIDвы также можете заглянуть в /proc/$PPID/«каталоги», чтобы получить более подробную информацию.

Связанный контент