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

23497
Bart van Heukelom

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

startup.sh

knetworkmanager emesene keepassx 

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

10

6 ответов на вопрос

14
Kim

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

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

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

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

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

knetworkmanager & emesene & keepassx & 
2
Doug Harris

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

Действительно, это то, что я пытаюсь сделать. Я исправил это сейчас, спасибо. Bart van Heukelom 14 лет назад 0
1
dmckee

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

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

(knetworkmanager; emesene; keepassx) & 

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

(knetworkmanager && emesene && keepassx) & 
0

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

0
Abhinav

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

Похожие вопросы