Как получить точные команды, которые запускает процесс 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' < ./environcmdlinefile - покажет вам точно аргументы командной строки запущенного процесса. Вы можете просмотреть эти аргументы как: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 фактическим идентификатором процесса этого скрипта). Он расскажет вам, что делает работающий скрипт, возможно, в гораздо большем количестве деталей, которые вам нужны.