如何在systemd服务中正确设置php脚本?

时间:2018-04-21 02:38:24

标签: php linux systemd

SO, 我正在尝试使用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启动和停止命令成功运行,脚本本身运行正常。

任何人都可以看到我可能遗失的任何东西吗?

1 个答案:

答案 0 :(得分:0)

listen-stop.sh脚本可能用action = stop调用php脚本,对吗?可能就像:

#!/bin/sh
echo $(curl http://website.com/logssomethingtoadatabase.php?action=stop)
你在while (true)循环中试图实现的目标是行不通的,因为start调用触发的php脚本总是会有$ _GET [&#39; action&#39 ;] =&#39;开始&#39;。你后续执行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脚本时,都会创建一个新实例,因此您无法进行#34; talk&#34;到您执行systemctl start时创建的实例。