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启动和停止命令成功运行,脚本本身运行正常。
任何人都可以看到我可能遗失的任何东西吗?
答案 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
时创建的实例。