Насколько я знаю, есть две ситуации, которые могут привести к завершению процесса после того, как он был защищен nohup
, и каждая ситуация имеет свой обходной путь.
Одна возможность, которая здесь не имеет место, заключается в том, что система использует systemd, где logind.conf
настроен с KillUserProcesses=yes
. В этом случае закрытие терминала не вызовет проблем, а вот выход из системы будет. Обходной путь в этом случае — использовать
$ systemd-run --scope --user [command]
По сути, это просто сообщает systemd, что он не должен убивать процесс.
Другая возможность заключается в том, что порожденный процесс реализует свой собственный обработчик для SIGHUP
, который отменяет защиту nohup
. В этом случае проблемы возникнут, как только оболочка будет закрыта, даже если вы остаетесь в системе. Вы можете проверить это с помощью:
$ nohup [command] &
$ grep Sig /proc/$!/status
Вы должны увидеть строку
SigIgn: 0000000000000001
(или любая другая строка шестнадцатеричных цифр ). SIGHUP
— это номер сигнала 1
, поэтому, если это большое -шестнадцатеричное число с порядком байтов имеет первый (наименьший -значащий )бит, установленный (, то есть последняя цифра — одна из 1, 3, 5, 7, 9, B, D или F ), то SIGHUP
игнорируется. В противном случае программа установила собственный обработчик, перекрывающий защиту nohup
.
В этом случае решение состоит в использованииdisown
:
nohup [command] & disown
Это удаляет процесс из списка заданий оболочки, предотвращая отправку SIGHUP
в первую очередь.
Используйте эту опцию --download-archive archivefile.txt
.
youtube-dl --download-archive FILE
youtube-dl
и читает, и добавляет в список файлов, которые нельзя загружать повторно. Каждый раз, когда файл успешно загружается, этот идентификатор видео добавляется в файл.