Подсчет прошедшего времени

What will happen if we return from a child process?

«Это действительно не работает, однако, чтобы вернуться во время работы в контексте ребенка из процедура, которая вызвала vfork ()с момента возможного возврата из vfork ()затем вернется к несуществующему кадру стека."

Я не понимаю это буквально. Байты в области стека буквально не исчезают после каждой инструкции POP (или RETURN ). Однако если вы вернетесь, продолжите работу и выполните инструкцию PUSH (или CALL ), она заменит предыдущее значение в стеке.

Это всего лишь один яркий пример странных вещей, которые произойдут в целом.если вы вызовете vfork(), а затем сделаете что-нибудь, чтобы изменить какую-либо часть памяти вашего процесса.

[Технически я предполагаю то же поведение, что и в Linux. Другое поведение vfork ()было технически разрешено POSIX. Я не знаю, нашел ли кто-нибудь применение технической гибкости POSIX, кроме предоставления vfork (), который идентичен fork ()].

0
02.05.2021, 19:28
1 ответ

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

Например, переменная 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в командной строке ).

Также убедитесь, что строка#!-является первой строкой файла (, как показано здесь в моем примере ). Код в вопросе этого не делает. Обратите внимание, что строка#!-полностью игнорируется , если вы используете явный интерпретатор в командной строке при вызове скрипта.

0
28.07.2021, 11:35

Теги

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