2010-08-28 105 views
3

我有一個腳本init.d中,看起來像:的init.d腳本掛

#!/bin/bash 
# chkconfig 345 85 60 
# description: startup script for swapi 
# processname: swapi 

LDIR=/var/www/html/private/daemon 
EXEC=swapi.php 
PIDF=/var/run/swapi.pid 
IEXE=/etc/init.d/swapi 

### BEGIN INIT INFO 
# Provides: swapi 
# Required-Start: $local_fs 
# Required-Stop: 
# Default-Start: 3 4 5 
# Default-Stop: 0 1 2 6 
# Short-Description: startup script for swapi 
# Description: startup script for swapi.php which processes actionq into switch 
### END INIT INFO 

if [ ! -f $LDIR/$EXEC ] 
then 
     echo "swapi was not found at $LDIR/$EXEC" 
     exit 
fi 

case "$1" in 
    start) 
     if [ -f $PIDF ] 
     then 
       echo "swapi is currently running. Killing running process..." 
       $IEXE stop 
     fi 
     $LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$! 
     echo $MYPID > $PIDF 
     echo "swapi is now running." 
     ;; 
    stop) 
     if [ -f $PIDF ] 
     then 
       echo "Stopping swapi." 
       PID_2=`cat $PIDF` 
       if [ ! -z "`ps -f -p $PID_2 | grep -v grep | grep 'swapi'`" ] 
       then 
         kill -9 $PID_2 
       fi 
       rm -f $PIDF 
     else 
       echo "swapi is not running, cannot stop it. Aborting now..." 
     fi 
     ;; 
    force-reload|restart) 
     $0 stop 
     $0 start 
     ;; 
    *) 
     echo "Use: /etc/init.d/swapi {start|stop|restart|force-reload}" 
     exit 1 
esac 

然後,我有一個存活的cronjob調用此如果PID下降。問題在於,只要我像cron作業那樣運行keepalive腳本(例如,run-parts/var/www/html/private/5min),(keepalive腳本位於/ var/www/html/private/5min) 。

在我的init.d腳本中是否存在某些我不知道的東西?

我一直在這個問題上絞盡腦汁,幾個小時了!我在centos4 btw。

感謝您的任何幫助。 -Eric

編輯:

保活/的cronjob腳本簡化測試,以一個簡單的:

#!/usr/bin/php 
<? 

exec("/etc/init.d/swapi start"); 

?> 

奇怪,這是從swapi.php輸出誤差投入的/ var /假脫機/郵件像正常的cron輸出,除了我已經把所有的輸出轉儲到init.d腳本中的swapi.log中?

當我從cli運行keepalive.php(來自/的root)時,它的運行方式與我預期的完全相同。

當keepalive運行ps aux | grep的PHP的樣子:

root  4525 0.0 0.0 5416 584 ?  S 15:10 0:00 awk -v progname=/var/www/html/private/fivemin/keepalive.php progname {????? print progname ":\n"????? progname="";????  }????  { print; } 
root  4527 0.7 1.4 65184 14264 ?  S 15:10 0:00 /usr/bin/php /var/www/html/private/daemon/swapi.php 

,如果我做了:從CLI

/etc/init.d/swapi stop 

那麼這兩個程序都不再列出。

Swapi ls -l命令的樣子:

-rwxr-xr-x 1 5500 5500 33148 Aug 29 15:07 swapi.php 

這裏是crontab的樣子:

*/5 * * * * root run-parts /var/www/html/private/fivemin 

這裏是swapi.php

#!/usr/bin/php 
<? 
chdir(dirname(__FILE__)); 
include("../../config/db.php"); 
include("../../config/sql.php"); 
include("../../config/config.php"); 
include("config_local.php"); 
include("../../config/msg.php"); 

include("../../include/functions.php"); 

set_time_limit(0); 
echo "starting @ ".date("Ymd.Gi")."...\n"; 
$actionstr = ""; 
while(TRUE){ 

我的第一位修改了init.d腳本並將init放在變量聲明之上,但沒有什麼區別。

+0

請顯示使用cron作業條目,以及swapi.php的頭文件和它擁有的權限(swapi.php目錄中的'ls -l')。 – polemon 2010-08-28 07:03:54

+0

另外,嘗試從控制檯手動運行您的init腳本幾次,您通常會在那裏遇到問題。只要確保您使用的條件與被稱爲cron作業(用戶,權限,shell等)的條件完全相同。 – polemon 2010-08-28 07:08:00

+0

在執行kill -9之前,您應該嘗試'kill -15'。有關示例,請參閱'/ etc/init.d'中的其他腳本。它可能沒有任何區別,但是你應該將INIT節移動到變量定義之上。如果你正在做'ps -p',我認爲你不需要'grep -v grep'(grep'swapi''可能不是必需的,但它可以作爲完整性檢查)。你真的需要展示你的Keepalive腳本和它的cron條目。 – 2010-08-28 15:00:48

回答

5

答案是bash的是保持開放,因爲我的init.d腳本沒有重定向stderr輸出。我現在已將其更改爲

$LDIR/$EXEC &> $LDIR/swapi.log & MYPID=$! 

現在它功能完好。

感謝大家的幫助!

0

當您從cron運行一個命令,環境是不一樣的,當它從bash命令行登錄後運行的。我懷疑在這種情況下,該sh是無法理解swapi.php作爲PHP命令。

做一個

which php 

,看看你的php二進制文件,並添加到您的初始化。d腳本

PHP=/usr/bin/php 
... 
$PHP $LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$! 

也許並不重要,但你可能要到輸出從cron

0 * * * * /path/to/script 2>&1 >> /dev/null 

例如重定向。

+0

如果php解釋器不能被找到,那麼腳本就會拋出一個錯誤,而不會卡住。 – polemon 2010-08-28 07:16:19

+0

PHP腳本將由shell解釋,而不是由php解釋器解釋。如果'<'(PHP腳本的第一個字符通常用於'<?php')被shell解釋,而不是驅動到php解釋器,它很可能會掛起。這可能是php腳本中的另一個詞 - 但cron無論如何不太可能調用php解釋器,並且在這樣的腳本中很可能使用PHP正確解釋的行將不會被shell以相同的方式理解,並可能導致過程掛起。 – 2010-08-28 07:31:04

+0

我們能否看到swapi.php腳本更好地瞭解shell被解釋時會發生什麼? – 2010-08-28 07:38:53

0

確保您的腳本有正確執行權限,權利人,和第一線應該是這樣的:

#!/usr/bin/php 
<?php