如何为 shell 脚本创建服务,以便可以像守护进程一样启动和停止它?

如何为 shell 脚本创建服务,以便可以像守护进程一样启动和停止它?

我正在使用 CentOS 7,我的目标是每五秒创建一个 cron,但根据我的研究,我们只能使用 cron 一分钟,所以我现在要做的是创建一个 shell 文件。
命中

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 的相同内容放入其中,但在 stop 方法中start(){}给出了错误。}

答案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 

当然,您想要作为服务执行的脚本应该转到eg /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. 重新加载所有 systemd 服务文件: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

tmux使用退出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. 使用 root 访问权限登录服务器
  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

相关内容