저는 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를 사용한다고 생각합니다. 시스템에 이런 경우가 있으면 다음을 시도해 보십시오.
실행하려는 스크립트 명령을
/usr/bin/myscript
.스크립트를 실행 가능하게 만드는 것을 잊지 마십시오
chmod +x
.다음 파일을 생성합니다:
/etc/systemd/system/my.service
[Unit]
Description=My Script
[Service]
Type=forking
ExecStart=/usr/bin/myscript
[Install]
WantedBy=multi-user.target
모든 시스템 서비스 파일을 다시 로드합니다.
systemctl daemon-reload
시작 서비스를 이용하여 제대로 작동하는지 확인하세요
systemctl start my
.
보너스:
systemd 서비스를 테스트하려면 두 개의 창으로 tmux 환경을 시작할 수 있습니다. 여기서 상단 창은 스크립트( stdout
및 stderr
)의 출력을 모니터링하고 하단 창은 서비스를 다시 시작하는 데 사용할 수 있습니다. 이를 위해서는 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
tmux
Exit 를 사용한 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 스크립트를 서비스로 변환하는 데 매우 유용합니다.
- 루트 액세스 권한으로 서버에 로그인
- 다음을 생성하세요체계필수 서비스의 단위 파일 및 권한 변경은 다음과 같습니다.
touch /lib/systemd/system/test.service
chmod 664 /lib/systemd/system/test.service
- 다음을 추가하세요.체계서비스를 정의하는 유닛 파일
[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
- 서비스로 활성화
systemctl daemon-reload
systemctl enable test.service
- 다음 명령을 사용하여 시작, 중지, 상태 및 다시 시작
systemctl start test.service
systemctl stop test.service
systemctl status test.service
systemctl restart test.service