nohup command
означает «запустить command
и игнорировать сигналы HUP ».
Поэтому, прежде чем мы сможем эффективно использовать nohup
, мы должны спросить: когда и как отправляется SIGHUP
? Как сказано в руководстве Bash: «Перед выходом интерактивная оболочка повторно отправляет SIGHUP всем заданиям, запущенным или остановленным». . Далее говорится, что правильный способ подавить это поведение - использовать disown
. Я понимаю, что вы спрашиваете о nohup
, но стоит отметить, что disown
- это предполагаемый и более простой способ достичь sh того, чего вы хотите. Обратите внимание, что disown
- это , а не эквивалент nohup
.
Причина, по которой nohup
сложно работать здесь, заключается в том, что он применяется к одному процессу, тогда как &
создает фон задание всей команды конвейер , который может состоять из нескольких процессов. Это означает, что вам нужно nohup
каждую команду в конвейере, чтобы гарантировать, что отдельные команды не получают SIGHUP, например:
$ nohup ls Music/*mp3 2>/dev/null | nohup xargs -d "\n" nohup mplayer &> /dev/null &
Это должно работать, хотя Я не тестировал его с этими c командами. Если это не так, скорее всего, другой процесс, который вы не запускаете напрямую, все еще получает сигнал SIGHUP. С этим труднее справиться, именно поэтому у нас есть disown
.
предложение manishg также разумно; переместив конвейер в отдельный процесс, вы можете nohup
этот процесс, который, в свою очередь, должен предотвратить получение SIGHUP своих дочерних процессов при закрытии оболочки.
Все сказанное, вам не нужны здесь ls
и xargs
; find
может использоваться с аналогичным эффектом и упростит рассуждение о команде. Попробуйте:
$ nohup find Music -maxdepth 1 -name '*mp3' -exec mplayer {} + &> /dev/null &