通用linux后台运行shell脚本

经常遇到开启后需要占一个终端窗口的应用。写了一个通用的后台运行脚本用nohup在后台运行,将运行pid输出到文件,可以查看nohup.out中的输出内容。适用于GoAgent、grant watch、rails开发模式等。可以把脚本加在~/.bash_profile中,实现登陆后自动启动。修改PROGNAME中的内容为要运行的程序名,修改run中的运行命令为你要执行的命令即可。

#!/bin/sh
PID=0
DIR=`dirname $0`
PIDFILE=$DIR/nohup.pid
OUTFILE=$DIR/nohup.out
PROGNAME='GoAgent'

run() {
    nohup $DIR/proxy.py>>$OUTFILE 2>&1 & echo $!>$PIDFILE
}

init() {
    if [ -f $PIDFILE ]; then
        PID=`cat $PIDFILE`
    fi
}

check() {
    if [ $PID -eq 0 ]; then
        return 1
    else
        kill -0 $PID 2>/dev/null
    fi
}

start() {
    init
    check
    if [ $? -eq 0 ]; then
        echo "$PROGNAME is run!" && exit 1
    else
        run
        echo "Start $PROGNAME!" && exit 0
    fi
}

silent() {
    init
    check
    if [ $? -eq 0 ]; then
        exit 1
    else
        run
        exit 0
    fi
}

restart() {
    init
    check
    if [ $? -eq 0 ]; then
        kill -9 $PID>/dev/null 2>&1
    fi
    run
    echo "Restart $PROGNAME!" && exit 0
}

stop() {
    init
    check
    if [ $? ]; then
        kill -9 $PID>/dev/null 2>&1
        echo "$PROGNAME is stop!" && exit 0
    else
        echo "$PROGNAME is not run!" && exit 1
    fi
}

status() {
    init
    check
    if [ $? -eq 0 ]; then
        echo "$PROGNAME is run!" && exit 0
    else
        echo "$PROGNAME is not run!" && exit 1
    fi
}

output() {
    if [ -f $OUTFILE ]; then
        watch -n 1 tail $OUTFILE
    else
        echo "$OUTFILE is not find!" && exit 1
    fi
}

clean() {
    if [ -f $OUTFILE ]; then
        rm -f $OUTFILE
    fi
    if [ -f $PIDFILE ]; then
        rm -f $PIDFILE
    fi
    echo 'Clean success!' && exit 0
}

case "$1" in
    start)
        $1
        exit 0
        ;;
    silent)
        $1
        exit 0
        ;;
    restart)
        $1
        exit 0
        ;;
    stop)
        $1
        exit 0
        ;;
    status)
        $1
        exit 0
        ;;
    output)
        $1
        exit 0
        ;;
    clean)
        $1
        exit 0
        ;;
    *)
        echo $DIR
        echo 'Usage: {start|stop|restart|silent|status|output|clean}'
        ;;
esac

命令说明:
start   启动
silent  安静模式启动(无输出)
stop    停止
restart 重启
status  查看运行状态
output  查看输出
clean   清除out和pid文件