2015-12-25 92 views
1

我在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 

我不知道是什麼的問題。請幫我整理一下。

+0

請在'PID = $(cat $ PIDFILE)'行的下面放上'pgrep -u $ RUNAS -f $ NAME>/dev/null',然後做一個'echo $?'。如果'pgrep'命令運行良好,我們應該得到'0'。 – sjsam

+0

此外,我會仔細檢查進程名稱是否正好是'MyStagingMailQueue'。 – sjsam

+0

謝謝@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仍然存在」我不知道如何擺脫這個問題 –

回答

1

由於您使用的是CentOS 7,最好創建一個systemd service

第一步:

爲您服務的服務文件說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 

希望這會有所幫助。

+0

謝謝你的回答sjsam,所以你的意思是說我使用下面的命令而不是「pgrep -u $ RUNAS -f $ NAME>/dev/null」。我不知道腳本爲什麼會終止。我正在使用centos 7服務器設置我的腳本。 –

+0

你可以在終端上單獨嘗試上述命令嗎? – sjsam

+0

輸出:: 啓動服務 MyStagingEmailQueue現在正在運行時,PID是781 根@ wb01開發[〜]#PS -p $(須藤貓/var/run/MyStagingMailQueue.pid)-o COMM =:沒有任何返回 –