我有一个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
然后我有一个keepalive cronjob,如果pid发生故障,就会调用它。 问题是keepalive脚本每当我运行它像一个cron作业(即运行部分/ var / www / html /私人/五分钟),(Keepalive脚本在/ var / www / html /私人/五分钟) 。
在我的init.d脚本中是否有一些我很想念的东西?
我已经在这个问题上花费了好几个小时了! 我在上btw。
谢谢你的帮助。 -Eric
编辑:
Keepalive / cronjob脚本被简化为testing一个简单的:
#!/usr/bin/php <? exec("/etc/init.d/swapi start"); ?>
奇怪的是这是从swapi.php的错误输出被放到/ var / spool / mail像普通的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
如果我做一个:
/etc/init.d/swapi stop
从cli那么这两个程序不再列出。
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放在variables声明的上面,但是没有什么区别。
答案是bash保持打开状态,因为我的init.d脚本没有重定向stderr输出。 我现在已经改变了
$LDIR/$EXEC &> $LDIR/swapi.log & MYPID=$!
现在它功能完美。
感谢大家的帮助!
当你从cron
运行一个命令时,这个环境和登录后从bash命令行运行的环境是不一样的。在这种情况下,我会怀疑sh
不能把swapi.php
理解为一个PHP命令。
做一个
which php
看你的php二进制文件是什么,并将其添加到你的init.d脚本
PHP=/usr/bin/php ... $PHP $LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$!
可能不是那么重要,但是你可能想重定向cron
行的输出
0 * * * * /path/to/script 2>&1 >> /dev/null
例如。
确保您的脚本具有正确的执行权限,正确的所有者,并且第一行应该如下所示:
#!/usr/bin/php <?php