2

我正在尝试每 10 分钟检查一次我的某个进程是否正在运行,如果没有,请重新启动该进程。我希望这个脚本在系统启动时自动启动,所以我选择了Linux 中的服务

所以这就是我所做的:

  • 编写了一个 Bash 脚本作为服务。
  • startshell脚本的方法中,在无限while循环中,检查是否存在临时文件。如果可用,请执行我的逻辑,否则请打破循环。
  • 在该stop方法中,删除临时文件。
  • 然后我使用 update-rc.d 将此脚本添加到系统启动。

一切都很好,除了一件事。如果我这样做./myservice start了,那么终端就会挂起(它应该在运行一个无限循环),但是如果我这样做,ctrl-z那么脚本将被终止并且我的任务将不会执行。如何使此脚本从终端启动并正常执行?(比如,说,./etc/init.d/mysql start)。也许在后台执行该过程并返回。

我的 Bash 脚本如下:

#!/bin/bash

# Start the service
start() {

    #Process name that need to be monitored
    process_name="mysqld"

    #Restart command for process
    restart_process_command="service mysql start"

    #path to pgrep command
    PGREP="/usr/bin/pgrep"

    #Initially, on startup do create a testfile to indicate that the process
    #need to be monitored. If you dont want the process to be monitored, then
    #delete this file or stop this service
        touch /tmp/testfile

        while true;
        do

        if [ ! -f /tmp/testfile ]; then
             break
        fi

        $PGREP ${process_name}

        if [ $? -ne 0 ] # if <process> not running
        then
        # restart <process>
        $restart_process_command
        fi

        #Change the time for monitoring process here (in secs)
        sleep 1000

    done
}

stop() {
       echo "Stopping the service"
       rm -rf /tmp/testfile
}
### main logic ###
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        ;;
  restart|reload|condrestart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac
exit 0
4

3 回答 3

4

在后台执行该功能。说:

start)
      start &

而不是说:

start)
      start
于 2013-11-13T12:50:55.707 回答
1

您应该将循环本身分离到一个单独的脚本中,并根据您的发行版中针对非自守护应用程序的首选方式从启动脚本中运行后一个脚本。

请注意,即使不是从终端运行,您当前的启动脚本也可能会挂起系统启动,至少对于大多数传统的初创公司而言(我不会说 systemd 和其他可以并行启动多个脚本的当代启动脚本,但它们肯定会认为启动还没有完成)。但是如果通过 ssh 登录,您可能会错过它,因为 sshd 将在您的脚本之前启动。

于 2013-11-13T12:48:43.623 回答
1

在我看来,值得使用调度程序来调度这种脚本,cron而不是编写独立的初始化脚本。

cat > /usr/local/bin/watch-mysql.sh <<-"__SEOF__"
    #!/bin/sh
    set -e

    # if this file exists monitoring is stopped
    if [ -f /var/run/dont-watch-mysql.lck ]; then
      exit 0
    fi

    process_name="mysqld"        
    restart_process_command="service mysql restart"
    PGREP="/usr/bin/pgrep"

    $PGREP ${process_name}

    if [ $? -ne 0 ] # if <process> not running
    then
        # restart <process>
        $restart_process_command
    fi
__SEOF__

# make the script executable
chmod u+x /usr/local/bin/watch-mysql.sh

# schedule the script to run every 10 minutes
(crontab -l ; echo "*/10 * * * * /usr/local/bin/watch-mysql.sh") | uniq - | crontab -

如果您只是创建文件/var/run/watch-mysql.lck,则不会对其进行监视。

于 2013-11-13T13:03:05.303 回答