Как получить точные команды, которые запускает процесс bash?
Если скрипт bash запущен, он появится в моем ps
вывод как
# ps -e
[...]
10043 pts/1 00:00:00 bash
[...]
Как мне узнать, какие именно команды выполняются?
Спасибо,
2 ответа
На самом деле, насколько мне известно, не очень хороший способ увидеть точные команды, выполняемые внутри интерпретатора bash с точки зрения постороннего. Однако есть несколько вещей, которые вы можете сделать, чтобы узнать больше о запущенном процессе.
- использование
strace(1)
как пользователь root для подключения к идентификатору процесса и печати системных вызовов, в которых выполняется процесс. Вы можете ограничить область выводаstrace
с-e
вариант. Например, чтобы увидеть только операции записи, которые, как правило, такие вещи, какstdout
сценария запуска:strace -p 10043 -s99999 -e write
- Использовать
/proc
файловая система, чтобы узнать больше о процессе. Например, для PID10043
вы можетеcd /proc/10043
, Он будет содержать интересные файлы, такие как:environ
файл - содержит среду запущенного процесса. Для просмотра установленных переменных вы можете запустить:tr '\0' '\n' < ./environ
cmdline
file - покажет вам точно аргументы командной строки запущенного процесса. Вы можете просмотреть эти аргументы как:tr '\0' ' ' < /proc/19774/cmdline | sed 's/ $/\n/'
,ps(1)
Команда также отображает такую информацию, какps -up 19774
,fd
папка - содержит дескрипторы открытого файла запущенного процесса. Для просмотра файлов, открытых процессом, вы можетеls -l ./fd/
,lsof(8)
Команда также отображает этот вид информации. Для скриптов bash, дескриптор файла255
обычно содержит работающий скрипт (т.е./proc/19774/fd/255
). Это не всегда так.
- использование
pstree(1)
просмотреть процесс и его дочерние процессы, чтобы получить представление о месте выполнения скрипта. напримерpstree -ap 10043
Попробуйте это
Создать /tmp/daemonwait
с содержанием:
cat > /tmp/daemonwait <<'EOF'
while sleep 1;do echo hello;done
EOF
Как обычный пользователь запускайте скрипт.
bash /tmp/daemonwait > /dev/null &
#save the PID for later use
pid=$!
Поскольку вы начали процесс как пользователь, вы можете прочитать /proc
файловая система этого процесса.
Вот несколько примеров из приведенного выше описания, чтобы попробовать.
#view the running bash script; press q for quit
less /proc/$pid/fd/255
#view the environment of the running bash script
tr '\0' '\n' < /proc/$pid/environ | less
#watch the process write to stdout or stderr; requires root
sudo strace -p $pid -s99999 -e write
#list the process, child processes, and their args
pstree -ap $pid
Когда скрипт не является файловым дескриптором 255
Изучение когда файловый дескриптор 255
это не скрипт, который выполняется
#view all open files of the process
ls -l /proc/$pid/fd/
#notice the daemonwait script is file descriptor 255
Давайте теперь относимся к daemonwait
как исполняемый скрипт. Примечание: если вы не используете bash в качестве оболочки по умолчанию, вам нужно добавить #!/bin/bash
к началу /tmp/daemonwait
скрипт.
kill $pid
chmod 755 /tmp/daemonwait
/tmp/daemonwait > /dev/null &
pid=$!
Давайте снова посмотрим на файловые дескрипторы для запущенного процесса.
ls -l /proc/$pid/fd/
#notice the daemonwait script is now file descriptor 254
Убирать
Вымойтесь, когда закончите играть.
kill $pid
rm /tmp/daemonwait
Вариант 1. Запустите ваш скрипт с bash -x /path/to/your/script.sh
, Bash затем распечатает каждую выполняемую строку с префиксом +.
Вариант 2: используйте strace: strace -p 10043
(заменив 10043 фактическим идентификатором процесса этого скрипта). Он расскажет вам, что делает работающий скрипт, возможно, в гораздо большем количестве деталей, которые вам нужны.