
Мне было интересно, есть ли способ отследить, откуда была запущена команда в Linux.
Например, если я вызываю скрипт, есть ли способ отследить, откуда он был вызван, например, запущен ли он из программы или другого скрипта bash?
решение1
Если ваш скрипт написан на bash, то есть встроенная переменная $PPID (сокращение от parent's process ID, я полагаю), которую вы можете использовать, чтобы узнать, кто вызвал ваш скрипт. Вот пример:
CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER
Объяснение:
- $PPID содержит идентификатор родительского процесса (вызывающего).
- the пскоманда выводит список всех процессов
- Theгрэпкоманда ищет строку, содержащую PPID в начале строки
- 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/
«каталоги», чтобы получить более подробную информацию.