Подтвердить что ты не робот

Запустите bash script как демон

У меня есть script, который запускает мой PHP скрипт каждый X раз:

#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done

Как я могу запустить его как демон?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

[Ниже приведен код bash для систем Debian - дистрибутивы Ubuntu, Linux Mint и т.д.)

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

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

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

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

cat  /var/log/TheNameOfYourDaemonJobLog.log

& бык; Теперь вы можете запустить/остановить/перезапустить/получить статус своего демона с помощью:

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

sudo service TheNameOfYourDaemonrestart restart

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

sudo service TheNameOfYourDaemonstart start

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

sudo service TheNameOfYourDaemonstop stop

статус: это покажет статус службы

sudo service TheNameOfYourDaemonstatus status

Ответ 3

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

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

Ответ 4

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

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") &

Ответ 5

Некоторые комментаторы уже заявили, что ответы на ваш вопрос не будут работать для всех дистрибутивов. Поскольку вы не включили CentOS в вопрос, а только в теги, я хотел бы опубликовать здесь темы, которые необходимо понять, чтобы иметь возможность контролировать его/ее работу независимо от распределения:

  1. что такое демон init (необязательно)
  2. что такое файл inittab (/etc/inittab)
  3. что делает файл inittab в вашем дистрибутиве (например, запускает ли он все скрипты в /etc/init.d?)

Для вашей проблемы можно запустить скрипт в sysinit, добавив эту строку в /etc/inittab и сделав его респавн в случае его завершения:

# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh

Конечно, скрипт должен быть выполнен исполняемым заранее:

chmod +x /path/to/my_script.sh

Надеюсь это поможет