Безопасно ли использовать & и перенаправление вывода вместо nohup?

Конечно, это просто сделать с помощью правил исключения. Чтобы исключить каталог и все его содержимое, просто исключите сам каталог, он даже не будет пройден. Чтобы включить каталог somedir , но не его содержимое, т.е. передать пустой каталог, исключите somedir / * . Когда предложение exclude начинается с / , это путь от корня каталога, который вы синхронизируете.

rsync -a --exclude='/version/photofolder/*' --exclude='anotherfolderwithstupidname/*' htdocs/ elsewhere/

Если вы хотите включить все подкаталоги … / version , но не файлы, не являющиеся каталогами, в … / version , а не содержимое подкаталогов:

rsync -a --include='/version/*/' --exclude='/version/*' htdocs/ elsewhere/

Если хотите для включения всех подкаталогов … / version и их содержимого, но не файлов, не являющихся каталогами, в … / version :

rsync -a --include='/version/*/' --include='/version/*/*' --exclude='/version/*' htdocs/ elsewhere/
3
17.07.2017, 23:23
2 ответа

Can I safely assume my processes won't end if I don't use nohup

Нет. Если терминал зависает и у него есть интерактивная оболочка в качестве лидера сеанса, оболочка получит SIGHUP и повторно отправит его своим заданиям, которые не были отклонены.

Если оболочка завершает работу добровольно, она отправляет SIGHUP своим заданиям, если включена опция huponexit.

Если оболочка завершается добровольно и есть остановленные собственные задания, bash уничтожит их с помощью SIGTERM (не уверен, что это стандартное поведение ).

Если оболочка добровольно завершает работу и есть остановленные отмененные задания, драйвер терминала уничтожит их с помощью SIGHUP (это определенно стандарт -обязательно ).

Таким образом, вы все еще можете быть убиты с помощью SIGHUP в различных сценариях.

Тем не менее, глядя на исходный код nohup в http://src.gnu-darwin.org/src/usr.bin/nohup/nohup.c.html, он кажется более или менее выполнимым в чистой оболочке:

nohup_sh()
(
    set -e
    if [ -t 1]; then
        exec >> nohup.out || exec >> "$HOME/nohup.out"
    fi
    if [ -t 0 ]; then
        exec 0</dev/null
    fi
    if [ -t 2 ]; then
        exec 2>&1
    fi
    trap '' HUP #ignore SIGHUP (inheritable)
    set -m || : #to prevent SIGINT and SIGQUIT from being ignored
    #(probably not needed, but the nohup binary won't ignore them, unlike
    # & without set -m)

    command "$@" &
)

Возможно, вам не понадобятся дополнительные данные за пределами trap '' HUP, хотя задание получит SIGPIPE, если оно попытается записать на отключенный терминал (, что предотвращается перенаправлением ).

2
27.01.2020, 21:15

Why doesn't the process stop when I exit the shell?

Возможно, потому что вы сказали disownоболочке disown. Или вы можете не использовать интерактивную оболочку управления заданиями в качестве процесса лидера сеанса.

Комбинированная модель групп сеансов и процессов, на которой мир остановился в 1980-х годах, работает следующим образом. :Существует лидер сеанса процесс. Это то, что получает сигнал зависания от терминальной линейной дисциплины , когда терминал кладет трубку. Ожидается, что он будет усиливать этот сигнал, посылая сигнал всем «заданиям», которые он породил. Это сделают интерактивные оболочки управления заданиями ; большинство других программ не предполагают, что они будут выполнять обязанности руководителей сессий, и не будут.

Использование nohupприводит к тому, что процессы в этих «заданиях» игнорируют сигнал зависания, когда лидер сеанса посылает им его. Использование disownзаставляет оболочку лидера сеанса забыть о задании, так что она вообще никогда не отправляет ему сигнал о зависании.

Can I safely assume my processes won't end if I don't use nohup?

Нет. Если они не были disownизменены, то им будет отправлен сигнал завершения сеанса интерактивным процессом оболочки управления заданиями.

Более того, :Люди из systemd пытались реализовать механизм пользовательского -пространства, эквивалентный сеансам ядра, но они сделали из этого немного свиного уха, что вносит дополнительные сложности в (некоторые )] системные операционные системы. При зависании сеанса systemd вместо отправки SIGHUPтолько лидеру сеанса, как это делает линейная дисциплина ядра, они ошибочно отправляют SIGTERMна все процессы, ошибочно означая завершение работы , а не зависание .

SIGTERMко всем процессам — это, конечно, то, что происходит в стандартной модели групп сеансов и процессов при завершении работы системы; и это убивает все процессы,в том числе отвергнутые и те, которые игнорируют сигнал зависания. Конечно, это также уничтожит ваши процессы, которые не были ни disowned, ни nohuped.

Дополнительная литература

3
27.01.2020, 21:15

Теги

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