start-stop-daemon在命令行工作,但在/etc/init.d脚本中不起作用
问题描述:
我试图在/etc/init.d中获得一个启动脚本(用于名为ar_sendmail的ruby gem)/ar_sendmail:start-stop-daemon在命令行工作,但在/etc/init.d脚本中不起作用
#! /bin/sh
echo "in /etc/init.d/ar_sendmail"
DIR=/home/max/work/e_learning_resource/trunk
PATH=/var/lib/gems/1.8/bin
DAEMON=/var/lib/gems/1.8/bin/ar_sendmail
DAEMON_OPTS="-e production -d --batch-size 100 --delay 150"
NAME=ar_sendmail
DESC=ar_sendmail
PID_FILE=/home/max/work/e_learning_resource/trunk/shared/log/ar_sendmail.pid
test -x $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon -d $DIR --start --quiet --pidfile $PID_FILE \
--exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
kill -TERM `cat $PID_FILE`
rm $PID_FILE
echo "$NAME."
;;
restart)
echo -n "Restarting $DESC: "
kill -TERM `cat $PID_FILE`
rm $PID_FILE
sleep 1
start-stop-daemon -d $DIR --start --quiet --pidfile \
$PID_FILE --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|reload}" >&2
exit 1
;;
esac
exit 0
它的启动 - 停止 - 守护线吹起来,说:“启动 - 停止守护程序:未找到”。但是,当我手动将值插入该行时,并在命令行上运行它时,它可以正常工作。
我的第一个想法是它是shebang线,但#! /bin/sh
应该是正确的吗?这绝对是正确的文件夹,以及我在其他/etc/init.d脚本中使用的文件夹。
我的第二个想法是,它与sudo相关:我一直在测试非sudo中的start-stop-daemon并在sudo模式下运行/etc/init.d/ar_sendmail。但是,我也可以用sudo运行start-stop-daemon。
那种难倒,有什么想法?
答
将一个source /etc/profile
添加到脚本的开头,以便您获得路径设置。
答
由于@Dysaster所指出的,你这条线覆盖你PATH
:
PATH=/var/lib/gems/1.8/bin
因为你给的完整路径名守护进程,我想你大概不甚至需要将/var/lib/gems/1.8/bin
添加到您的路径,除非ar_sendmail
需要执行该目录中的程序而不知道它们的路径。 (这肯定是不幸的,但很容易用:PATH=/var/lib/gems/1.8/bin:$PATH
修复。)
检查你正在覆盖PATH变量的行,停止访问/ sbin,/ usr/sbin等。你可能想让PATH = $ PATH:/ blah/blah,或者显式添加必要的目录。 – vhallac
@Dysaster,应该是一个答案... – sarnold
@sarnold真的,不知道我为什么使用评论。 :) – vhallac