如果没有停止,需要在1小时内重启服务器脚本

时间:2011-12-10 03:09:58

标签: linux bash sh

我正在开发远程服务器网络设置。 我需要的是一个脚本,它将重命名“/ etc / network / interfaces”文件,然后重新启动计算机。我得到的重命名,但我没有得到的是我如何终止这个脚本,以防我不需要它。 查看一切是否正常我想发出一个终止此脚本的停止命令,以便服务器不会重新启动。

所以这就是我到目前为止所得到的。问题是:

  1. 它不会返回提示
  2. 停止命令不起作用。由于某种原因它没有得到pid文件。它返回“rm:missing operand”,虽然echo告诉我pid文件名为“start.pid”并且它出现在/ tmp文件夹中
  3. 有什么想法吗?

    #! /bin/sh
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    
    . /lib/lsb/init-functions
    
    
    case "$1" in
      start)  
            ;;
        export PIDFILE=/var/run/${1}.pid
        ps -fe | grep ${1} | head -n1 | cut -d" " -f 6 > ${PIDFILE}
    
            sleep 30 #3600 
    
            log_action_msg "WARNING: Will in 60 sec rename /etc/network/interfaces and then restart"
            sleep 30# 60
    
            SUFFIX=$(date +%s)
            #cp /etc/network/interfaces /etc/network/interfaces.$SUFFIX
            cp /tmp/interfaces /etc/network/interfaces.$SUFFIX
            sleep 1
            #cp /etc/network/interfaces.org /tmp/interfaces
            cp /tmp/interfaces.org /tmp/interfaces
            sleep 1
            #reboot -d -f -i
            ;;
      stop)
        if [ -f ${PIDFILE} ]; then
            rm ${PIDFILE}
        fi
    
        exit 0
    
            ;;
      *)
            echo "Usage: $0 start|stop" >&2
            exit 3
            ;;
    esac
    

3 个答案:

答案 0 :(得分:1)

通常这是使用'pid-file'完成的 - 一个预定的文件,它保存当前正在运行的进程的进程标识符。这样,如果它被调用并被告知停止,它会查找pid文件并使用kill命令向当前正在运行的进程发送信号。

这也有另一个好处 - 如果你在脚本被告知启动时检查是否存在pid文件(以及是否存在该进程),你可以防止意外启动脚本两次,这会阻止这两个实例都有问题。

答案 1 :(得分:1)

stop操作可以在适当的位置创建文件do.not.restart.server

可以修改start操作以检查do.not.restart.server文件是否存在,并避免重新启动服务器(如果存在)。它可能/应该删除文件以供将来重新启动 - 或者它应该在它进入休眠状态之前将其删除。

答案 2 :(得分:0)

好的,这是一个工作脚本,它可以满足我的需求。我仍然希望的唯一改进是如何从sleep命令返回提示。 功能就在那里,所以我发布它以防其他人也需要。

感谢Dan和Jonathan Leffler的帮助和想法。

#! /bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

export PIDFILESTART=/tmp/network-safty-restart-start.pid
export PIDFILESTOP=/tmp/network-safty-restart-stop.pid
#export FILE=/etc/network/interfaces
export FILE=/tmp/interfaces

case "$1" in
  start)  
    if [ -f ${PIDFILESTART} ]; then
            rm ${PIDFILESTART}
    fi
    if [ -f ${PIDFILESTOP} ]; then
            rm ${PIDFILESTOP}
    fi  
    ps -fe | grep ${1} | head -n1 | cut -d" " -f 6 > ${PIDFILESTART}

        sleep 3600 

        log_action_msg "WARNING: Will in 60 sec rename ${FILE} and then restart"
        sleep 60

    if ! [ -f ${PIDFILESTOP} ]; then
        log_action_msg "Restarting NOW"
            SUFFIX=$(date +%s)
            cp ${FILE} ${FILE}.${SUFFIX}
            sleep 1
            cp ${FILE}.org ${FILE}
            sleep 1
            reboot -d -f -i
    else
        rm ${PIDFILESTOP}
        log_action_msg "NOT Restaring as you wish"
        fi
        ;;
  stop)
    if [ -f ${PIDFILESTART} ]; then
            rm ${PIDFILESTART}
        ps -fe | grep ${1} | head -n1 | cut -d" " -f 6 > ${PIDFILESTOP}
        log_action_msg "Terminating restart script"

    fi
    log_action_msg "Terminated restart script"

    exit 0
        ;;
  *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac