Как устранить неполадки сценария bash, вызываемого сценарием python, вызываемым программой?

Все системы BSD имеют 2 кольца защиты, и да, это зависит от архитектуры процессора. К настоящему времени OpenBSD использует кольцо 0 для ядра и кольцо 3 для пространства пользователя. Вот и все.

0
04.12.2019, 00:07
2 ответа

Используйте командуstraceдля отладки программы со всеми ее дочерними процессами.

Для нового процесса:

strace -f command

Для существующего процесса:

strace -fp PID

Если вы не знаете идентификатор своего процесса (, поскольку он выполняется слишком быстро ), вы можете добавить sleep 20в начало сценария оболочки, чтобы у вас было время найти его PID через ps wuax | grep bash. ] затем используйте приведенную выше команду с найденным PID.

Для фильтрации вывода используйте -e. Для сохранения в файл используйте -o. Чтобы увеличить размер сообщений, используйте -s. Для получения дополнительной справки запустите:man strace.

Для лучшего форматирования см.:Как разобрать strace в оболочке в обычный текст?


Вот практический пример. Учитывая следующий файл myscript.sh:

#!/bin/bash -x
echo "$1"

Я выполнил следующую команду:

strace -f -e trace=execve,read,write -s1000 bash -x./myscript.sh foo bar

, который выдал следующий результат:

execve("/bin/bash", ["bash", "-x", "./myscript.sh", "foo", "bar"], [/* 41 vars */]) = 0
...
read(3, "#!/bin/bash -x\necho \"$1\"\n", 80) = 25
read(255, "#!/bin/bash -x\necho \"$1\"\n", 25) = 25
write(2, "+ echo foo\n", 11+ echo foo
)            = 11
write(1, "foo\n", 4foo
)                    = 4
read(255, "", 25)                       = 0
+++ exited with 0 +++
1
28.01.2020, 02:38

Если на терминале ничего не отображается, вы можете перенаправить вывод в файл, например.

Для всего вашего скрипта (весь вывод )в файл (изменить его в Python):

./script.sh &> output.log

Для одной команды:

mv -v $1/*.mp4. 2> errors.log

Также рассмотрите возможность добавления set -xили использования #!/bin/bash -x.


Чтобы перенаправить все stdout и stderr в файл, см.:Перенаправление stderr и stdout в Bash , то есть:

# Close STDOUT file descriptor
exec 1<&-
# Close STDERR FD
exec 2<&-

# Open STDOUT as $LOG_FILE file for read and write.
exec 1<> output.log

# Redirect STDERR to STDOUT
exec 2>&1
0
28.01.2020, 02:38

Теги

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