Все системы BSD имеют 2 кольца защиты, и да, это зависит от архитектуры процессора. К настоящему времени OpenBSD использует кольцо 0 для ядра и кольцо 3 для пространства пользователя. Вот и все.
Используйте команду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 +++
Если на терминале ничего не отображается, вы можете перенаправить вывод в файл, например.
Для всего вашего скрипта (весь вывод )в файл (изменить его в 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