Запуск процесса Linux в фоновом режиме

10

Я пытаюсь создать скрипт, который запускает некоторые программы

startup.sh

knetworkmanager
emesene
keepassx

Проблема в том, что когда я запускаю скрипт, он только запускает knetworkmanager. Это потому, что он запустит его, а затем подождите, пока он не закончится. Как я могу запустить программу, не дожидаясь ее? Я не думаю, что могу просто добавить «&» после каждой команды, потому что все процессы будут по-прежнему убиты, когда сценарий будет завершен.

Барт ван Хейкелом
источник

Ответы:

16

Когда оболочка, выполняющая скрипт, закрывается, она отправляет сигнал HUP запущенным процессам. Если те не поймают сигнал, они прекратят работу. Так что достаточно ли использовать &, зависит от приложения. Чтобы быть в безопасности, используйте nohup вот так:

nohup your-program >>/dev/null 2>>/dev/null &

Смотрите man-страницы для nohup и kill для более подробной информации или читайте статью в Википедии о nohup .

Ким
источник
Читая еще раз, неоднозначно, выходит ли OP из вызывающей оболочки или нет. Он только упоминает о выходе из сценария, а не о выходе из оболочки или терминала.
Адам Беллер
прочитав мой ответ еще раз, вы заметите, что я сказал «когда оболочка, выполняющая скрипт, закрывается». Предполагая, что у этой оболочки есть собственный виртуальный терминал (не подоболочка или что-то в этом роде), это правильно.
Ким
@ Ким: Это правда. Ваш ответ в порядке, я просто уверен, что ОП закрывает вызывающую оболочку или нет.
Адам Беллер
10

Нет, процессы не должны быть убиты, когда скрипт завершится, если вы используете &. Попытайся.

knetworkmanager &
emesene &
keepassx &
Адам Беллер
источник
2

Исходя из приведенных вами примеров программ, похоже, что вы пытаетесь запустить некоторые программы при запуске KDE. Если это так, взгляните на функцию автозапуска KDE. Эта статья обсуждает больше и дает инструкции о том, как добавить программы в автозапуск.

Даг Харрис
источник
Действительно, это то, что я пытаюсь сделать. Я исправил это сейчас, спасибо.
Барт ван Хейкелом
1

Как уже говорили другие, используйте &оператор, чтобы поместить команду в фоновый режим во время ее запуска оболочкой.

Если вы хотите, чтобы составные части работали по порядку (а не одновременно), но все же хотели, чтобы все было на заднем плане, используйте подоболочку:

(knetworkmanager; emesene; keepassx) &

или, если вы хотите, чтобы работа каждой части зависела от успешного завершения предыдущей части, используйте:

(knetworkmanager && emesene && keepassx) &
dmckee --- котенок экс-модератора
источник
0

Добавление '&' после каждой команды определенно будет работать. Это будет означать, что эти скрипты или программы будут продолжать работать даже после завершения файла startup.sh.


источник
0

Другой вариант - запустить процесс как демон, используя / sbin / start-stop-daemon.

Abhinav
источник