데몬처럼 시작하고 중지할 수 있도록 쉘 스크립트에 대한 서비스를 어떻게 생성할 수 있습니까?

데몬처럼 시작하고 중지할 수 있도록 쉘 스크립트에 대한 서비스를 어떻게 생성할 수 있습니까?

저는 CentOS 7을 사용하고 있으며 제 목표는 5초마다 cron을 생성하는 것입니다. 그러나 제가 조사한 바에 따르면 cron은 1분 동안만 사용할 수 있으므로 지금 하고 싶은 것은 쉘 파일을 생성하는 것입니다.
때리다

while sleep 5; do curl http://localhost/test.php; done

하지만 마우스 오른쪽 버튼을 클릭하여 수동으로 클릭했습니다.

내가 원하는 것은 이 파일에 대한 서비스를 생성하여 자동으로 시작하고 중지할 수 있도록 하는 것입니다.

찾았어요서비스 생성 스크립트

#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

그런데 start 메소드나 stop 메소드에 무엇을 써야할지 모르겠어서 hit.sh 와 같은 내용을 넣어봤는데 start(){}stop 메소드에서 에러가 났습니다.}

답변1

최신 시스템에서 스크립트를 데몬으로 실행하려는 사용자는 다음을 사용해야 합니다 systemd.

[Unit]
Description=hit service
After=network-online.target

[Service]
ExecStart=/path/to/hit.sh

[Install]
WantedBy=multi-user.target

다른 이름으로 저장 한 다음 등을 /etc/systemd/system/hit.service사용하여 시작/중지/활성화/비활성화할 수 있습니다 .systemctl start hit

2015년의 오래된 답변:

코드 예제를 재사용하려면 다음과 같을 수 있습니다.

#!/bin/bash

case "$1" in 
start)
   /path/to/hit.sh &
   echo $!>/var/run/hit.pid
   ;;
stop)
   kill `cat /var/run/hit.pid`
   rm /var/run/hit.pid
   ;;
restart)
   $0 stop
   $0 start
   ;;
status)
   if [ -e /var/run/hit.pid ]; then
      echo hit.sh is running, pid=`cat /var/run/hit.pid`
   else
      echo hit.sh is NOT running
      exit 1
   fi
   ;;
*)
   echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

물론 서비스로 실행하려는 스크립트는 로 이동해야 하며 /usr/local/bin/hit.sh, 위의 코드는 으로 이동해야 합니다 /etc/init.d/hitservice.

이 서비스를 실행해야 하는 각 런레벨에 대해 해당 기호 링크를 생성해야 합니다. 예를 들어, 심볼릭 링크라는 이름은 /etc/init.d/rc5.d/S99hitservice런레벨 5 서비스를 시작합니다. 물론 service hitservice start/를 통해 수동으로 시작하고 중지 할 수도 있습니다.service hitservice stop

답변2

CentOS 7 이상이 systemd를 사용한다고 생각합니다. 시스템에 이런 경우가 있으면 다음을 시도해 보십시오.

  1. 실행하려는 스크립트 명령을 /usr/bin/myscript.

  2. 스크립트를 실행 가능하게 만드는 것을 잊지 마십시오 chmod +x.

  3. 다음 파일을 생성합니다:

/etc/systemd/system/my.service

[Unit]
Description=My Script

[Service]
Type=forking
ExecStart=/usr/bin/myscript

[Install]
WantedBy=multi-user.target
  1. 모든 시스템 서비스 파일을 다시 로드합니다.systemctl daemon-reload

  2. 시작 서비스를 이용하여 제대로 작동하는지 확인하세요 systemctl start my.

보너스:

systemd 서비스를 테스트하려면 두 개의 창으로 tmux 환경을 시작할 수 있습니다. 여기서 상단 창은 스크립트( stdoutstderr)의 출력을 모니터링하고 하단 창은 서비스를 다시 시작하는 데 사용할 수 있습니다. 이를 위해서는 tmux설치가 필요하며 다음을 수행하십시오.

tmux new-session \; select-layout even-horizontal \; split-window -v journalctl -o cat --since=@$(date +%s) -f -u my \; rotate-window \; set -g status-bg colour0 \; set -g status-fg colour9 \; attach

그런 다음 다음 명령을 사용하여 서비스를 다시 시작합니다.

systemctl restart my

tmuxExit 를 사용한 ctrl-d다음 을 사용하십시오 ctrl-c.

스크립트와 서비스 파일이 만족스러우면 변경하세요.

Type=forking

입력하다

Type=simple

완벽한.

답변3

다음은 서비스로서의 스크립트입니다.

[Unit]
Description=To change In test buffer
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/test.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

답변4

아래 코드 블록은 Linux 스크립트를 서비스로 변환하는 데 매우 유용합니다.

  1. 루트 액세스 권한으로 서버에 로그인
  2. 다음을 생성하세요체계필수 서비스의 단위 파일 및 권한 변경은 다음과 같습니다.
touch /lib/systemd/system/test.service
chmod 664 /lib/systemd/system/test.service
  1. 다음을 추가하세요.체계서비스를 정의하는 유닛 파일
[Unit]
Description=Test Service
After=network.target
 
[Service]
Type=forking
User=#username
PIDFile=#test.pid_path
ExecStart=#startup_script_path
ExecStop=#shutdown_script_path
 
[Install]
WantedBy=multi-user.target
  1. 서비스로 활성화
systemctl daemon-reload
systemctl enable test.service

  1. 다음 명령을 사용하여 시작, 중지, 상태 및 다시 시작
systemctl start test.service
systemctl stop test.service
systemctl status test.service
systemctl restart test.service

관련 정보