nohup
+ &
не "порождает новую консоль".Он просто создает фоновый процесс, который игнорирует сигнал зависания.См. статью в Википедии о nohup для получения дополнительной информации.
Я не знаю, почему уничтожение приложения убивает запущенную из него программу, но я могу предложить несколько вещей, которые можно попробовать.
Двойная вилка, предложенная Науэлем Фуйе, - хорошая идея.Пример правильного синтаксиса:
( nohup /usr/bin/liquidsoap $1 -- $2 </dev/null >/dev/null 2>&1 & )
sleep 1 # Wait to ensure that 'nohup' takes effect
</dev/null
не обязательно с nohup
, но я добавил его для согласованности.sleep 1
- это попытка избежать возможного состояния гонки между передним и фоновым процессами.
Если это не сработает, команда setsid
, если она у вас есть, может дополнительно изолировать ребенкапроцесс от своего родителя, поместив его в отдельную группу процессов и сеанс.Пример использования:
( setsid /usr/bin/liquidsoap $1 -- $2 </dev/null >/dev/null 2>&1 & )
sleep 1 # Wait to ensure that 'setsid' takes effect
См. О написании сценария оболочки Linux для безопасного отключения программ от терминала и Разница между nohup, disown и & для получения дополнительной информации.о setsid
.
Если у вас нет setsid
, или это не помогает, следующий вариант - использовать демон для запуска команды (что делает его полностью не связанным с процессом, который устанавливаетэто до запуска).Традиционный способ сделать это с помощью команды at
:
echo "/usr/bin/liquidsoap $1 -- $2" | at now
Для этого необходимо, чтобы демон atd
работал и у вас было разрешение на использование at
.См. Выполнить команду 'через 5 секунд для получения дополнительной информации о at
.
Современный способ запустить процесс из демона - использовать systemd-run
.См. Завершение работы, приостановка требует аутентификации, когда запланировано на , для примера использования systemd-run
вместо at
.