[ 已解决 ]startproc 创建 pid file 的问题

如题,系统是opensuse 12.3,init.d下x11vnc的启动脚本,能启动x11vnc,但是无法创建pid file
脚本具体如下:
#!/bin/sh
#
# /etc/init.d/vnc
#
### BEGIN INIT INFO
# Provides: x11vnc server
# Required-Start: xdm
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 5
# Default-Stop: 0 1 2 6
# Short-Description:
# Description: Start or stop vnc server
### END INIT INFO

#INIT SCRIPT VARIABLES
SERVICE=$(basename $0)
PIDFILE="/var/run/${SERVICE}.pid "
BIN="/usr/bin/x11vnc "
AUTH=`ps wwaux | grep '/X.*-auth' | grep -v grep | sed -e 's/^.*-auth *//' -e 's/ .*$//' | head -n 1`
OPT="-display :0 -auth ${AUTH} -forever -bg -nolookup -ping 60 -rfbauth /etc/x11vnc/x11vnc.pass -rfbport 5900 -shared -reopen -oa /var/log/x11vnc.log "
CMD=${BIN}${OPT}


. /lib/lsb/init-functions

# Reset status of this service
rc_reset


case "$1" in
    start)
    echo -n "Starting ${SERVICE}..."
        ## Start daemon with startproc(8). 
    /sbin/startproc -p /var/run/x11vnc.pid ${CMD}
    sleep 2s
    # Remember status and be verbose.
        rc_status -v
    ;;
    stop)
    echo -n "Shutting down ${SERVICE}..."
    killproc -TERM ${BIN}
    rc_status -v
    ;;
    try-restart)
        $0 status >/dev/null &&  $0 restart
        rc_status
        ;;
    restart)
        $0 stop
        $0 start
        rc_status
        ;;
    force-reload)
        echo -n "Reload service ${SERVICE}..."
        checkproc ${BIN}
        rc_status -v
        ;;
    reload)
        rc_status -v
        ;;
    status)
        echo -n "Checking for ${SERVICE}..."
        checkproc ${BIN}
        rc_status -v
        ;;
    probe)
        ;;
    *)
    echo "Usage: ${BIN} {start|stop|status|try-restart|restart|force-reload|reload|probe}"
    exit 1
    ;;
esac
rc_exit

请问该如何修改,才能使startproc创建pid文件呢?

你 man 一下 startproc,看看说明。

startproc 只是在那个位置查找 pidfile,至于 pidfile 怎么出来是 x11vnc 的任务。可能大部分命令行程序都会自己创建 pidfile 让你忘了这点…

所以有两种做法。一种是替换 startproc 为

start-stop-daemon --start --quiet --pidfile /var/run/x11vnc.pid --make-pidfile --background --exec ${CMD}

当然你要替换全部。

另一种是让 x11vnc 创建 pidfile

linux.die.net/man/1/x11vnc

-rmflag create:/var/run/x11vnc.pid

原理对,实现不一定对哦。未测试。

谢谢玛戈学姐,采用了第二种方法,成功创建了 pid file,但是发现了个奇葩事情,x11vnc 启动后创建的 pid file 和 x11vnc 的实际 pid 相差了 1 或 2 个数值。。。目前只能手动吧真实 pid 重定向到 pidfile,覆盖 x11vnc 创建的。。。

你手动运行下 x11vnc 看看匹配不,它可能把启动脚本的进程号给写进去了。毕竟你这 x11vnc 是在脚本里启动的,它的选项是给直接启动用的。

Sent from my Galaxy Note 2 using Tapatalk 2

之前就已经尝试过直接启动了,情况是一样的,在系统监视器里面查看,感觉像是同时启动了两个进程,然后再退出一个进程。。。

你不是有 log 嘛。真相都在 log 里。难道这启动脚本不是你碉堡自己写的而是网上找的?那看来是我错了,我以为你很碉堡只是 pid 的问题不明白而已…

你看 log,你有些参数配置不对,然后 x11vnc 自己后台 reload 了一下。根据提示改好参数就可以了。

Sent from my Galaxy Note 2 using Tapatalk 2

呵呵,本来就是菜鸟一枚 ,经过 2 个多小时的反复运行试验,最终发现是 x11vnc 的 -bg 参数导致的,去掉这个参数就可以了。。。