在PHP中通过Cronjob / bash重新启动NAMED / bind服务

时间:2016-07-30 18:38:31

标签: php bash service bind crontab

我只想根据文件是否存在重新启动named。我整天都被困在这一天。

创建bash文件的命令:

$this->execute('echo -e "#!/bin/bash\nsudo /sbin/service named reload" >> /var/reload_named.sh');

这是我的cronjob:

*/1 * * * * cronjob: sudo sh /var/reload_named.sh; rm -f /var/reload_named.sh;

以下是cronjob运行时发生的情况(/var/log/cron):

Jul 30 18:34:01 digitalocean CROND[24864]: (root) CMD (cronjob: sudo sh /var/reload_named.sh; rm -f /var/reload_named.sh )
Jul 30 18:34:01 digitalocean CROND[24862]: (root) UNSAFE (”example@digitalocean.com”)

出于某种原因,它说它是UNSAFE。我尝试过使用sudo和不使用sudo。

它设法删除文件但不重命名。我已经尝试过这么多其他方法来实现这一点。

我已经尝试过(通过大量谷歌搜索):

  • 在php
  • 中运行exec('名为restart'的服务)
  • 创建.c文件并添加从php
  • 运行它的用户
  • 直接在service named restart
  • 中投放crontab -e
  • 尝试使用sudo
  • 运行它时会有不同的变化
  • 尝试将apache用户添加到sudo(仍然失败)

任何有用的帮助

(我在Centos 6.7上)

1 个答案:

答案 0 :(得分:0)

我终于想出办法来做到这一点。这是一个以root身份SSH自身并运行服务命令的方法:

$this->root_execute('service named reload');

    public function root_execute($command = '')
    {
        set_include_path('/path/to/dir/ssh/');
        require_once('Net/SSH2.php');

        $ssh = new Net_SSH2(SSH_HOST);

        if (!$ssh->login(SSH_USER, SSH_PASS)) {
            exit('failed');
        }
        $res = $ssh->exec($command);
        $ssh = null;
        restore_include_path();
        return $res;
    }

(如果从http .php运行,很遗憾不适用于HTTPD)