【问题标题】:How to properly set up php script in systemd service?如何在 systemd 服务中正确设置 php 脚本?
【发布时间】:2018-04-21 02:38:23
【问题描述】:

所以, 我正在尝试在 Axis 相机上使用 systemd 设置服务(我相信它是 Arch linux 或自定义的非常精简的 Linux 版本)。我的服务设置如下:

myservice.service:

[Unit]
Description=Ping Monitoring Daemon
After=network.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/etc/init.d/listen-start.sh
ExecStop=/etc/init.d/listen-stop.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

这里是listen-start.sh:

#!/bin/sh
echo $(curl http://website.com/logssomethingtoadatabase.php?action=start)

我的 php 脚本:

<?php
echo 'Service Started';

while (true) {
$foo = print_r($_SERVER, true);

$blnStop = false;

if ( $_GET['action'] === 'start') {
    mail("test@myemail.com","Debug", "Camera service started with current values:\r\n\r\n" . $foo);
} else {
    mail("test@myemail.com","Debug", "Camera service stopped with current values:\r\n\r\n" . $foo);

    $blnStop = true;
}

if ( $blnStop ) {
    break 2;
}

sleep(60);
}

echo 'Service Stopped';
die();
?>

我遇到的问题是一旦我启动服务,我无法“停止它”,即使在它上面发出“systemctl stop”和“disable”命令后也是如此。我必须重启相机才能让它停止给我发电子邮件。我似乎无法让它“打破”while循环。

这里的目标是每 60 秒调用一次该脚本,这是一项设备监控工作。在这种情况下,我必须使用 systemd,因为这就是相机支持的全部。

附加信息:systemctl start 和 stop 命令成功运行,脚本本身运行良好。

谁能看到我可能遗漏的任何东西?

【问题讨论】:

    标签: php linux systemd


    【解决方案1】:

    listen-stop.sh 脚本可能正在调用带有 action=stop 的 php 脚本,对吧?大概是这样的:

    #!/bin/sh
    echo $(curl http://website.com/logssomethingtoadatabase.php?action=stop)
    

    您在while (true) 循环中尝试实现的目标将不起作用,因为由start 调用触发的php 脚本将始终具有$_GET['action'] = 'start'。您随后执行 systemctl stop 不会影响已经运行的 php 脚本,这就是它永远不会结束执行的原因。

    问题:该 php 脚本是否应该对相机执行任何操作?还是只发送服务启动/停止的邮件通知?

    如果它只是邮件通知,那么您需要在该 php 脚本中拥有的是:

    <?php
    
    if ( $_GET['action'] === 'start') {
        mail("test@myemail.com","Debug", "Camera service started with current values:\r\n\r\n" . $foo);
        echo 'Service Started';
    } else {
        mail("test@myemail.com","Debug", "Camera service stopped with current values:\r\n\r\n" . $foo);
        echo 'Service Stopped';
    }
    
    ?>
    

    TL;DR:您已经以与 bash 守护程序脚本类似的模式编写脚本,但它不是这样工作的。每次执行 php 脚本时,都会创建一个新实例,因此您无法与执行 systemctl start 时创建的实例“交谈”。

    【讨论】:

    • 嗯,有道理。是的 - 如您所述,“停止”操作会更改 URL。一旦我开始工作,启动脚本最终会将某些内容记录到数据库中。 “while(true)”方法是否正确,或者将其设置为每 10 分钟左右调用一次该脚本的最佳方法是什么?正确的 systemd 条目应该是 Type-oneshot 还是 Type=simple?
    • while(true) 是正确编写的,但它没有为您提供任何东西,它只是使脚本处于不确定状态(当您使用 action=start 触发它时)。您需要在 php 外部以某种方式每 10 分钟触发一次新的执行。你应该在 linux 系统中检查crontab。最后,我对你问的 systemd 相关问题不太熟悉。
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2018-02-26
    • 2014-08-18
    相关资源
    最近更新 更多