Centos 7自定义bash脚本服务不工作

Centos 7自定义bash脚本服务不工作,bash,centos,systemd,Bash,Centos,Systemd,我在centos 7中创建了一个执事,用于从电子邮件队列发送电子邮件。 电子邮件队列在Yii1中实现。这很好,但当我尝试在服务器中创建并运行守护进程时,它失败并显示错误: echo "Error! Could not start MyStaging!" 我正在按照我找到的指示行事 检查时,我发现PID获取值1232,pgrep-u$RUNAS-f$NAME>/dev/null命令返回空值 以下是我的脚本: #!/bin/bash ### BEGIN INIT INFO # Provides:

我在centos 7中创建了一个执事,用于从电子邮件队列发送电子邮件。

电子邮件队列在Yii1中实现。这很好,但当我尝试在服务器中创建并运行守护进程时,它失败并显示错误:

echo "Error! Could not start MyStaging!"
我正在按照我找到的指示行事

检查时,我发现
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

我不知道是什么问题。请帮我整理一下。

既然您使用的是CentOS 7,最好创建一个
systemd服务

步骤1:

为您的服务创建一个服务文件,例如
yiicmail.service
。做:

sudo touch /etc/systemd/system/yiicmail.service

第二步:

使用您喜爱的编辑器打开上述文件,并将以下内容放入其中:

[Unit]
Description=yiic service
After=network.target

[Service]
Type=simple
User=root
ExecStart="/usr/bin/php5 /home/whizbite/public_html/staging/protected/yiic mailqueue run"
#If there are spaces, I would strings within quotes like above
Restart=on-abort


[Install]
WantedBy=multi-user.target

第三步:

现在是玩这项服务的时候了。要启动它,请执行以下操作:

sudo systemctl start yiicmail # You don't have to type full name, that is, yiicmail.service
要检查状态,请执行以下操作:

sudo systemctl status yiicmail
要阻止它,请执行以下操作:

sudo systemctl stop yiicmail
要在启动时启动服务,请执行以下操作:

sudo systemctl enable yiicmail
要在启动时禁用服务,请执行以下操作:

sudo systemctl disable yiicmail

希望这有帮助。

请将
pgrep-u$RUNAS-f$NAME>/dev/null
放在
PID=$(cat$PIDFILE)
行的正下方,然后执行
echo$?
。如果
pgrep
命令运行正常,我们应该得到
0
。另外,我会仔细检查进程名是否正确
MyStagingMailQueue
。谢谢@Sjsam,如果“pgrep-u$RUNAS-f$name>/dev/null&echo$?”,选项1:PID=$(cat$PIDFILE);然后选项2:PID=$(cat$PIDFILE)如果pgrep-u$RUNAS-f$NAME>/dev/null&echo$?然后,但双向显示进程正在运行,但当我显示状态时,它显示“进程似乎已停止,但pidfile仍然存在”我不知道如何解决此问题。sJam当我执行命令“service mystagingmailqueue start”时,它返回服务正在启动,但当我执行“service mystagingmailqueue status”时,它返回“进程似乎已停止,但pidfile仍然存在”。我希望您能得到您问题的答案。我理解pal,但请检查它在启动后立即崩溃的原因。感谢您的回答sjsam,所以您的意思是说我使用了下面的命令,而不是“pgrep-u$RUNAS-f$NAME>/dev/null”“。我不知道为什么脚本会终止。我正在centos 7服务器上设置脚本。输出::启动服务0 MyStagingEmailQueue正在运行,PID为781root@wb01-development[~]#ps-p$(sudo cat/var/run/MyStagingMailQueue.pid)-o comm=:没什么,没法理解你说的话。。当您运行命令ps-p$(sudo cat/var/run/MyStagingMailQueue.pid)-o comm=时,您得到了什么输出,但您说进程正在运行。您能否检查并确认
/var/log
中pid文件的名称?否。。当我执行命令“service mystagingemailqueue start/restart”时,返回“进程现在正在运行。您的pid为”但当立即执行“service mystagingemailqueue status”时,返回“进程似乎已停止,但pid文件仍然存在”