5

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

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

4 ответа4

4

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

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

Объяснение:

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

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

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

2

Если процесс все еще выполняется, вы можете использовать иерархическую визуализацию (называемую также лесом или деревом процесса), предлагаемую командой 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
0

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

ps -p $PPID -o args=

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .