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

Другие вопросы по тегам