2013-10-07 2 views

ответ

91

Чтобы запустить его как полный демон из оболочки, вам нужно будет использовать setsid и перенаправить его вывод. Вы можете перенаправить вывод в файл журнала или на /dev/null, чтобы отменить его. Предположим, что ваш скрипт называется myscript.sh, используйте следующую команду:

setsid myscript.sh >/dev/null 2>&1 < /dev/null & 

Это будет полностью отделить процесс от текущей оболочки (STDIN, стандартный вывод и стандартный поток ошибок). Если вы хотите сохранить вывод в файле журнала, замените первый /dev/null на ваш/path/to/logfile.

Вы должны перенаправить вывод, иначе он не будет работать как истинный демон (это будет зависеть от вашей оболочки для чтения и записи вывода).

+5

как мне его убить? –

+7

Вам нужно будет найти pid и отправить сигнал. Ниже приведен пример UNSAFE для Linux-систем: 'kill $ (ps -fade | grep myscript.sh | grep -v grep | awk '{print $ 2}')'. Это убьет все процессы, которые содержат «myscript.sh» в их имени или параметрах, поэтому его не очень безопасно использовать, но вы можете настроить его в соответствии с вашими потребностями. – micromoses

+3

Спасибо, это полезно! Не могли бы вы объяснить, что делает '2> & 1

15

Вы можете перейти на /etc/init.d/ - вы увидите шаблон демона, называемый скелетом.

Вы можете его дублировать, а затем ввести свой скрипт под функцию запуска.

+2

Вы также можете рассмотреть возможность запуска скрипта в backg раунд, добавив '&' в конце или запустив его без nohup. –

+0

@ LuisMuñoz, как я могу заставить его работать в фоновом режиме автоматически. например, когда вы запускаете запуск /etc/init.d/mysql, демон запускается и запускается в фоновом режиме по умолчанию. –

+0

@DavidOkwii помещает ваш код в функцию и запускает его в фоновом режиме. Проверьте мой ответ, добавленный к этому вопросу. –

23

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

[Код ниже Баш для систем Debian - Ubuntu, Linux Mint дистрибутивы и так далее]

простой способ:

простой способ будет отредактировать файл /etc/rc.local, а затем только что ваш скрипт запустить оттуда (т.е. каждый раз при загрузке системы) :

sudo nano /etc/rc.local 

Добавьте следующее и сохранить:

#For a BASH script 
/bin/sh TheNameOfYourScript.sh > /dev/null & 

лучший способ сделать это было бы создать Daemon с помощью Upstart:

sudo nano /etc/init/TheNameOfYourDaemon.conf 

добавить следующее:

description "My Daemon Job" 
author "Your Name" 
start on runlevel [2345]  

pre-start script 
    echo "[`date`] My Daemon Starting" >> /var/log/TheNameOfYourDaemonJobLog.log 
end script 

exec /bin/sh TheNameOfYourScript.sh > /dev/null & 

Сохраните это.

Убедитесь, что он выглядит нормально:

init-checkconf /etc/init/TheNameOfYourDaemon.conf 

Теперь перезагрузите машину:

sudo reboot 

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

cat /var/log/TheNameOfYourDaemonJobLog.log 

• Теперь вы можете запустить/остановить/перезагрузка/получить статус вашего Daemon с помощью :

рестарта: это остановит, а затем запустить службу

sudo service TheNameOfYourDaemonrestart restart 

старта: это запустит службу, если он не работает

sudo service TheNameOfYourDaemonstart start 

остановки: это прекратить обслуживание, если оно работает

sudo service TheNameOfYourDaemonstop stop 

статус: это будет отображать состояние службы

sudo service TheNameOfYourDaemonstatus status 
+4

Вы должны действительно указать, для какого дистрибутива это необходимо, потому что эти команды и пути не являются правильно на всех дистрибутивах. – SgtPooki

+1

Хорошая точка sgtPooki. Я добавил оговорку, поясняющую, что мой пример относится к дистрибутивам Ubuntu/Mint и т. Д.Спасибо за комментарий. – CMP

+0

Может ли кто-нибудь сделать надстройку systemd для этого ответа? :) – Mitja

1

Еще один крутой трюк, чтобы запустить функции или подоболочки в фоновом режиме, не всегда представляется возможным, хотя

name(){ 
    echo "Do something" 
    sleep 1 
} 

# put a function in the background 
name & 
#Example taken from here 
#https://bash.cyberciti.biz/guide/Putting_functions_in_background 

Запуск подоболочку в фон

(echo "started"; sleep 15; echo "stopped") & 

 Смежные вопросы

  • Нет связанных вопросов^_^