programing

bash 스크립트를 데몬으로 실행

shortcode 2021. 1. 16. 20:22
반응형

bash 스크립트를 데몬으로 실행


내 PHP 스크립트를 X 번 실행하는 스크립트가 있습니다.

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

데몬으로 시작하려면 어떻게해야합니까?


쉘에서 전체 데몬으로 실행하려면 setsid출력 을 사용 하고 리디렉션해야합니다. 출력을 로그 파일로 재 지정하거나 /dev/null버릴 수 있습니다. 스크립트가 myscript.sh라고 가정하면 다음 명령을 사용하십시오.

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

이렇게하면 현재 셸 (stdin, stdout 및 stderr)에서 프로세스가 완전히 분리됩니다. 출력을 로그 파일에 보관하려면 첫 번째 파일을 /dev/null/ path / to / logfile로 바꾸십시오 .

출력을 리디렉션해야합니다. 그렇지 않으면 실제 데몬으로 실행되지 않습니다 (출력을 읽고 쓰는 데 셸에 따라 다름).


데몬은 대화 형 사용자가 직접 제어하는 ​​것이 아니라 백그라운드 프로세스로 실행되는 프로그램입니다.

[아래 bash 코드는 Debian 시스템 용입니다-Ubuntu, Linux Mint 배포판 등]

간단한 방법 :

간단한 방법은 /etc/rc.local 파일을 편집 한 다음 거기에서 스크립트를 실행하는 것입니다 (즉, 시스템을 부팅 할 때마다) :

sudo nano /etc/rc.local

다음을 추가하고 저장하십시오.

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

이를 수행하는 더 좋은 방법은 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

• 이제 다음을 통해 데몬을 시작 / 중지 / 다시 시작 / 가져올 수 있습니다.

다시 시작 : 중지 된 다음 서비스를 시작합니다.

sudo service TheNameOfYourDaemonrestart restart

시작 : 실행 중이 아닌 경우 서비스를 시작합니다.

sudo service TheNameOfYourDaemonstart start

stop : 서비스가 실행중인 경우 중지됩니다.

sudo service TheNameOfYourDaemonstop stop

상태 : 서비스의 상태를 표시합니다.

sudo service TheNameOfYourDaemonstatus status

/etc/init.d/로 이동하면 skeleton이라는 데몬 템플릿이 표시됩니다.

복제 한 다음 시작 기능 아래에 스크립트를 입력 할 수 있습니다.


또 다른 멋진 트릭은 백그라운드에서 함수 나 서브 쉘을 실행하는 것입니다.

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

일부 논평자들은 이미 귀하의 질문에 대한 답변이 모든 배포판에 적용되지는 않는다고 말했습니다. 질문에 CentOS를 포함하지 않고 태그에만 포함했기 때문에 배포에 관계없이 진행 상황을 제어하기 위해 이해해야하는 주제를 여기에 게시하고 싶습니다.

  1. init 데몬이란 무엇입니까 (선택 사항)
  2. inittab 파일 (/ etc / inittab)이란 무엇입니까?
  3. inittab 파일이 배포판에서 수행하는 작업 (예 : 실제로 /etc/init.d의 모든 스크립트를 실행합니까?)

문제의 경우 / etc / inittab에 다음 줄을 추가하여 sysinit에서 스크립트를 시작하고 종료 될 경우 다시 생성되도록 할 수 있습니다.

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

The script has to be made executable in advance of course:

chmod +x /path/to/my_script.sh

Hope this helps

ReferenceURL : https://stackoverflow.com/questions/19233529/run-bash-script-as-daemon

반응형