【问题标题】:Init.d script hangingInit.d 脚本挂起
【发布时间】:2011-04-05 02:58:36
【问题描述】:

我有一个 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 出现故障,它会调用它。问题是每当我像 cron 作业一样运行时,keepalive 脚本都会挂起(即 run-parts /var/www/html/private/fivemin),(keepalive 脚本位于 /var/www/html/private/fivemin 中) .

我的 init.d 脚本中是否有一些我缺少的时髦的东西?

我已经为这个问题绞尽脑汁好几个小时了!顺便说一句,我在 centos4 上。

感谢您的帮助。 -埃里克

编辑:

keepalive/cronjob 脚本被简化为一个简单的测试:

#!/usr/bin/php
<?

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

?>

奇怪的是,swapi.php 的错误输出像正常的 cron 输出一样被放入 /var/spool/mail,除了我将所有输出都转储到 init.d 脚本中的 swapi.log 中?

当我从 cli 运行 keepalive.php(作为 / 的根目录)时,它的运行方式完全符合我的预期。

当 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 放在变量声明之上,它没有任何区别。

【问题讨论】:

  • 请显示使用 cron 作业条目,以及 swapi.php 的头部和它拥有的权限(ls -l 在 swapi.php 目录中)。
  • 另外,尝试从控制台手动运行你的初始化脚本几次,你通常会在那里遇到问题。只需确保使用与将其作为 cron 作业(用户、权限、shell 等)调用时完全相同的条件。
  • 您应该先尝试kill -15,然后再尝试kill -9。有关示例,请参见 /etc/init.d 中的其他脚本。它可能没有任何区别,但是您应该将您的 INIT 节移到变量定义之上。如果您正在使用ps -p,我认为您不需要grep -v grepgrep 'swapi' 可能不是必需的,但可以作为健全性检查)。您确实需要显示您的 keepalive 脚本及其 cron 条目。

标签: linux bash centos init.d


【解决方案1】:

答案是 bash 保持打开状态,因为我的 init.d 脚本没有重定向 stderr 输出。我现在把它改成了

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

它现在可以完美运行。

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    确保您的脚本具有正确执行权限、正确的所有者,并且第一行应如下所示:

    #!/usr/bin/php
    <?php
    

    【讨论】:

      【解决方案3】:

      当您从cron 运行命令时,环境与登录后从bash 命令行运行时的环境不同。我怀疑在这种情况下sh 无法理解@ 987654323@ 作为 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
      

      例如。

      【讨论】:

      • 如果找不到 php 解释器,那么脚本只会抛出错误,不会卡住。
      • php 脚本将由 shell 解释,而不是 php 解释器。如果&lt;(php 脚本的第一个字符通常为&lt;?php)由shell 解释,而不是驱动到php 解释器,它很可能会挂起。它可能是 php 脚本中的另一个词 - 但 cron 无论如何都不太可能调用 php 解释器,并且在这样的脚本中,很可能 woukd 被 PHP 正确解释的行不会被 shell 以同样的方式理解,并可能导致进程挂起。
      • 我们能否看到 swapi.php 脚本,以便更好地了解 shell 解释它时会发生什么?
      • @ring0:这就是为什么我要他的 swapi.php 的第一行;)
      • 感谢到目前为止的建议,我添加了所有要求的信息。希望有帮助!
      猜你喜欢
      • 2014-10-19
      • 2013-02-08
      • 2013-05-09
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多