ТАК,
Я пытаюсь настроить службу с помощью systemd на камере Axis (я считаю, что это 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("[email protected]","Debug", "Camera service started with current values:\r\n\r\n" . $foo);
} else {
mail("[email protected]","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 работают успешно, а сам скрипт работает нормально.
Может ли кто-нибудь увидеть что-то, чего мне не хватает?
Сценарий listen-stop.sh, вероятно, вызывает скрипт php с помощью action = stop, верно? вероятно, как:
#!/bin/sh
echo $(curl http://website.com/logssomethingtoadatabase.php?action=stop)
что вы пытаетесь достичь в этом while (true)
цикл не будет работать, потому что PHP-скрипт, который был запущен start
call, всегда будет иметь значение $ _GET [‘action’] = ‘start’. ваше последующее исполнение systemctl stop
не повлияет на уже запущенный скрипт php, поэтому его выполнение никогда не заканчивается.
ВОПРОС: этот сценарий php должен делать что-то в отношении камеры? или просто отправить почтовое уведомление о том, что служба запущена / остановлена?
если это только почтовое уведомление, то все, что вам нужно иметь в этом php-скрипте:
<?php
if ( $_GET['action'] === 'start') {
mail("[email protected]","Debug", "Camera service started with current values:\r\n\r\n" . $foo);
echo 'Service Started';
} else {
mail("[email protected]","Debug", "Camera service stopped with current values:\r\n\r\n" . $foo);
echo 'Service Stopped';
}
?>
TL; DRВы написали сценарий в похожем режиме, как сценарий bash daemon, но это не так. при каждом выполнении сценария php создается новый экземпляр, поэтому вы не можете «общаться» с экземпляром, который вы создали при выполнении systemctl start
,
Других решений пока нет …