我在centos 7中創建了一個deamon從電子郵件隊列發送電子郵件。
Centos 7自定義bash腳本服務不起作用
電子郵件隊列在Yii1中實現。這工作正常,但是當我試圖創建並在服務器上運行程序,但是它失敗並顯示錯誤:
echo "Error! Could not start MyStaging!"
我下面,我發現here指令。
在檢查時,我發現PID
獲取值1232和pgrep -u $RUNAS -f $NAME > /dev/null
命令返回空。
下面是我的腳本:
#!/bin/bash
### BEGIN INIT INFO
# Provides: MyStaging
# Required-Start: $local_fs $network $named $time $syslog
# Required-Stop: $local_fs $network $named $time $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: This service having purpose to send email from email queue where relevant email push by particular module operation in queue.
### END INIT INFO
SCRIPT="/usr/bin/php5 /home/my/public_html/staging/protected/yiic mailqueue run"
RUNAS=root
NAME=MyStagingMailQueue
PIDFILE=/var/run/$NAME.pid
LOGFILE=/var/log/$NAME.log
start() {
if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE); then
echo 'Service already running' >&2
return 1
fi
echo 'Starting service ' >&2
local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
# su -s /bin/sh $RUNAS -c "$CMD" > "$PIDFILE"
# Try with this command line instead of above if not workable
su -c "$CMD" $RUNAS > "$PIDFILE"
sleep 2
PID=$(cat $PIDFILE)
if pgrep -u $RUNAS -f $NAME > /dev/null
then
echo "$NAME is now running, the PID is $PID"
else
echo "Error! Could not start $NAME!"
fi
}
stop() {
if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
echo 'Service not running' >&2
return 1
fi
echo 'Stopping service ' >&2
kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
echo 'Service stopped' >&2
}
status() {
printf "%-50s" "Checking $NAME..."
if [ -f $PIDFILE ]; then
PID=$(cat $PIDFILE)
if [ -z "$(ps axf | grep ${PID} | grep -v grep)" ]; then
printf "%s\n" "The process appears to be dead but pidfile still exists"
else
echo "Running, the PID is $PID"
fi
else
printf "%s\n" "Service not running"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
我不知道是什麼的問題。請幫我整理一下。
請在'PID = $(cat $ PIDFILE)'行的下面放上'pgrep -u $ RUNAS -f $ NAME>/dev/null',然後做一個'echo $?'。如果'pgrep'命令運行良好,我們應該得到'0'。 – sjsam
此外,我會仔細檢查進程名稱是否正好是'MyStagingMailQueue'。 – sjsam
謝謝@Sjsam, 選項1:PID = $(cat $ PIDFILE) 如果「pgrep -u $ RUNAS -f $ NAME>/dev/null&echo $?「;然後 選項2:PID = $(cat $ PIDFILE) if pgrep -u $ RUNAS -f $ NAME>/dev/null&echo $? then 但這兩種方式都顯示進程正在運行,但是當我顯示狀態時它顯示「進程似乎已經死了,但pidfile仍然存在」我不知道如何擺脫這個問題 –