What will happen if we return from a child process?
«Это действительно не работает, однако, чтобы вернуться во время работы в контексте ребенка из процедура, которая вызвала vfork ()с момента возможного возврата из vfork ()затем вернется к несуществующему кадру стека."
Я не понимаю это буквально. Байты в области стека буквально не исчезают после каждой инструкции POP (или RETURN ). Однако если вы вернетесь, продолжите работу и выполните инструкцию PUSH (или CALL ), она заменит предыдущее значение в стеке.
Это всего лишь один яркий пример странных вещей, которые произойдут в целом.если вы вызовете vfork()
, а затем сделаете что-нибудь, чтобы изменить какую-либо часть памяти вашего процесса.
[Технически я предполагаю то же поведение, что и в Linux. Другое поведение vfork ()было технически разрешено POSIX. Я не знаю, нашел ли кто-нибудь применение технической гибкости POSIX, кроме предоставления vfork (), который идентичен fork ()].
Проблема с вашим сценарием никак не связана с синхронизацией команд. Проблема с вашим сценарием заключается в том, что он работает в среде, отличной от среды, в которой вы запускаете его из командной строки.
Например, переменная PATH
может отличаться, что приводит к тому, что некоторые утилиты не могут быть найдены, или в скрипте есть интерактивные элементы, которые, очевидно, не могут быть выполнены, когда скрипт работает в не-интерактивном режиме. окружающая обстановка.
Вы также упоминаете в комментариях , что вы запускаете скрипт, используя sh
, а не bash
, что дополнительно означает, что переменная SECONDS
может не существовать (в зависимости от того, какая оболочка sh
] оказывается реализованным ).
Я вижу, что скрипт выполняет почти каждую команду, используя sudo
. Это заставляет меня предположить, что вы должны запускать скрипт в собственном crontab пользователя root, а не в crontab не -учетной записи привилегированного пользователя (, и удалить все sudo
вызовы из сценария ). Измените crontab пользователя root, используя sudo crontab -e
.
Кроме того, убедитесь, что для переменной PATH
в сценарии задан список каталогов, позволяющий найти все используемые вами утилиты. Например,
#!/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin:$PATH
SECONDS=0
apt-get update && apt-get upgrade
# etc.
В частности, вы должны убедиться, что переменная PATH
содержит каталоги, в которых живут apt-get
и pihole
(найдите их с помощью command -v pihole
и command -v apt-get
в командной строке ).
Также убедитесь, что строка#!
-является первой строкой файла (, как показано здесь в моем примере ). Код в вопросе этого не делает. Обратите внимание, что строка#!
-полностью игнорируется , если вы используете явный интерпретатор в командной строке при вызове скрипта.