Как получить точные команды, которые инициировал процесс удара?

Если выполнение сценария удара, это появится в моем ps вывод как

# ps -e 
[...]
10043 pts/1    00:00:00 bash
[...]

Как я узнаю точные выполняемые команды?

Спасибо,

0
задан 30 November 2016 в 03:50

2 ответа

Нет действительно хорошего способа видеть, что точные команды выполняются в интерпретаторе удара от точки зрения постороннего до моего знания. Однако существует несколько вещей, которые можно сделать для получения дополнительной информации о рабочем процессе.

  • Использовать strace(1) как пользователь root, чтобы соединиться с идентификатором процесса и распечатать системные вызовы, в которых процесс делает. Можно ограничить объем того, что производится strace с -e опция. Например, для наблюдения только операций записи, которые обычно являются вещами как stdout из запущенного скрипта: strace -p 10043 -s99999 -e write
  • Используйте /proc файловая система для получения дополнительной информации о процессе. Например, для PID 10043 Вы можете cd /proc/10043. Это будет содержать интересные файлы как:
    • environ файл - Содержит среду рабочего процесса. Для просмотра переменных набора, можно работать: tr '\0' '\n' < ./environ
    • cmdline файл - покажет Вам точно параметры командной строки рабочего процесса. Можно просмотреть эти аргументы как: tr '\0' ' ' < /proc/19774/cmdline | sed 's/ $/\n/'. ps(1) управляйте также отображает этот вид информации как ps -up 19774.
    • fd папка - содержит открытые дескрипторы файлов рабочего процесса. Для просмотра файлов, открытых процессом, Вы можете ls -l ./fd/. lsof(8) управляйте также отображает этот вид информации. Для сценариев удара, дескриптора файла 255 обычно содержит под управлением сценарий (т.е. /proc/19774/fd/255). Это не всегда имеет место.
  • Использовать pstree(1) просмотреть процесс и его дочерние процессы для понимания местоположение, выполняющееся в рамках сценария. например. pstree -ap 10043

Попробовать

Создайте a /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 как исполняемый сценарий.Примечание: если Вы не будете использовать удар в качестве своей оболочки по умолчанию затем, то необходимо будет добавить #!/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
3
ответ дан 28 September 2019 в 02:28

Опция 1: Запустите свой сценарий с bash -x /path/to/your/script.sh. Bash затем распечатает каждую строку, которую он выполняет, снабженный префиксом +.

Опция 2: используйте strace: strace -p 10043 (замена 10043 с фактическим идентификатором процесса того сценария). Это скажет Вам, что под управлением сценарий делает, вероятно, в намного большем количестве деталей, в которых Вы нуждаетесь.

3
ответ дан 28 September 2019 в 02:28

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

Похожие вопросы: