Конечно, это просто сделать с помощью правил исключения. Чтобы исключить каталог и все его содержимое, просто исключите сам каталог, он даже не будет пройден. Чтобы включить каталог 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/
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, если оно попытается записать на отключенный терминал (, что предотвращается перенаправлением ).
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
ко всем процессам — это, конечно, то, что происходит в стандартной модели групп сеансов и процессов при завершении работы системы; и это убивает все процессы,в том числе отвергнутые и те, которые игнорируют сигнал зависания. Конечно, это также уничтожит ваши процессы, которые не были ни disown
ed, ни nohup
ed.