Centos 7自定义bash脚本服务不工作
我在centos 7中创建了一个执事,用于从电子邮件队列发送电子邮件。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:
电子邮件队列在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文件仍然存在”