systemd 相关问题

Systemd是为Linux设计的系统管理守护程序。使用systemd或其库将此标记用于*编程问题*。关于*配置守护进程*(包括编写单元文件)的问题更好地针对Unix和Linux:https://unix.stackexchange.com。

php-mqtt 在发布者离线一段时间后停止接收消息

我设置了一个 systemd 服务(在 Ubuntu 22.04 中),以便使用 php-mqtt 库处理来自 Mosquitto 的消息。这是我的整个代码: 我设置了一个 systemd 服务(在 Ubuntu 22.04 中),以便使用 php-mqtt 库处理来自 Mosquitto 的消息。这是我的整个代码: <?php header("Access-Control-Allow-Origin: *"); require 'database.php'; require('vendor/autoload.php'); use PhpMqtt\Client\MqttClient; use PhpMqtt\Client\ConnectionSettings; ini_set('display_errors', 1); error_reporting(E_ALL); $server = '<server>'; $port = 1883; $clientId = '<id>'; $username = '<user>'; $password = '<password>'; $connectionSettings = (new ConnectionSettings) ->setUsername($username) ->setPassword($password) ->setKeepAliveInterval(60) ->setLastWillQualityOfService(1) ->setConnectTimeout(60) ->setMaxReconnectAttempts(PHP_INT_MAX) ->setReconnectAutomatically(true); $mqtt = new MqttClient($server, $port, $clientId, MqttClient::MQTT_3_1); $mqtt->connect($connectionSettings, false); function append($db, $sample) { try { $stmt = $db->prepare("INSERT INTO sensors (sampled, temperature, humidity) VALUES (CURRENT_TIMESTAMP(), :temperature, :humidity);"); $stmt->execute($sample); } catch (PDOException $e) { echo "Error: " . $e->getMessage(); } } $mqtt->subscribe('<topic1>', function ($topic, $message) use (&$data, &$dbApp) { printf("Received message on topic [%s]: %s\n", $topic, $message); if ($message === 'Offline') { $sample = [ 'temperature' => NULL, 'humidity' => NULL ]; append($dbApp, $sample); } }, 0); $mqtt->subscribe('<topic2>', function ($topic, $message) use (&$data, &$dbApp) { printf("Received message on topic [%s]: %s\n", $topic, $message); $obj = json_decode($message); $sample = [ 'temperature' => floatval($obj->Temperature), 'humidity' => floatval($obj->Humidity) ]; append($dbApp, $sample); }, 0); $mqtt->loop(true); $mqtt->close(); $dbApp = null; 这里是 systemd 单元: [Unit] Description=MQTT receiver [Service] Type=simple ExecStart=/usr/bin/php /usr/share/nginx/html/mqtt.php Restart=always RestartSec=10 [Install] WantedBy=multi-user.target 这里观察到的行为: 启动经纪人 开始mqtt.service 启动发布者(物联网设备),以 LWT 形式发送 <topic1> 离线消息并发送 <topic2> 实际数据 检查一切正常:好的 关闭发布器电源并等待断开连接(收到LWT消息):OK 一段时间后再次打开并确认它仍然按预期工作:好的 如果第 6 点中的“某个时间”的持续时间是几个小时(例如过夜),就会出现问题。第二天早上,我打开传感器电源,但 PHP 页面不再接收消息(即不再显示“已收到主题消息...”)。 使用 mosquitto_sub 订阅主题会收到消息 - 因此代理正在运行。 systemd 服务处于活动状态并且没有显示错误,我看到了前一天的最后一行。重新启动服务会再次收到消息。 这似乎是一个很好的指标,我在代码中犯了错误,但我找不到错误所在。 根据用户Namoshek的好建议,我解决了更改代码如下: database.php <?php $SERVER_APP = "localhost"; $DATABASE_APP = "<database>"; $USERNAME_APP = "<user>"; $PASSWORD_APP = "<password>"; function db_connect() { global $SERVER_APP, $DATABASE_APP, $USERNAME_APP, $PASSWORD_APP; try { $dbApp = new PDO("mysql:host=$SERVER_APP;dbname=$DATABASE_APP", $USERNAME_APP, $PASSWORD_APP); $dbApp->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbApp->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); return $dbApp; } catch (PDOException $e) { echo "Connection to APP database failed:" . PHP_EOL . $e->getMessage(); } } mqtt.php <?php header("Access-Control-Allow-Origin: *"); require 'database.php'; require('vendor/autoload.php'); use PhpMqtt\Client\MqttClient; use PhpMqtt\Client\ConnectionSettings; ini_set('display_errors', 1); error_reporting(E_ALL); $server = '<address>'; $port = 1883; $clientId = '<id>'; $username = '<user>'; $password = '<password>'; $connectionSettings = (new ConnectionSettings) ->setUsername($username) ->setPassword($password) ->setKeepAliveInterval(60) ->setConnectTimeout(60) ->setMaxReconnectAttempts(PHP_INT_MAX) ->setReconnectAutomatically(true); $mqtt = new MqttClient($server, $port, $clientId, MqttClient::MQTT_3_1_1); $mqtt->connect($connectionSettings, false); function append($sample) { $dbApp = db_connect(); try { $stmt = $dbApp->prepare("INSERT INTO sensors (sampled, temperature, humidity) VALUES (CURRENT_TIMESTAMP(), :temperature, :humidity);"); $stmt->execute($sample); } catch (PDOException $e) { echo "Error: " . $e->getMessage(); } $dbApp = null; } $mqtt->subscribe('<topic>', function ($topic, $message) { printf("Received message on topic [%s]: %s\n", $topic, $message); $obj = json_decode($message); $sample = [ 'temperature' => floatval($obj->Temperature), 'humidity' => floatval($obj->Humidity) ]; append($sample); }); $mqtt->loop(true); $mqtt->close(); 现在每次我需要追加记录时都会创建与数据库的连接,并在之后立即关闭。

回答 1 投票 0

如何使用systemctl systemd启动svnserve

subversion 软件包不包含 systemd 服务文件。自动启动的最简单解决方案是什么?我尝试 [单元] 描述=Subversion 协议守护进程 之后=syslog.tar...

回答 6 投票 0

监控故障并快速重启systemd服务

我正在 Ubuntu 上运行 24/7 的 YouTube 流。我的 ffmpeg 命令包含在 systemd 服务中。有几次 ffmpeg 命令失败,systemd 重新启动的速度不够快,无法完成...

回答 1 投票 0

从 sd_device_enumerator_get_device_first 返回的 sd-device ref 是否需要取消引用

我们是否需要对从 sd_device_enumerator_get_device_first 返回的 ref 调用 sd_device_unref ? 在从

回答 1 投票 0

Python/Systemd - 如何从多个脚本编辑同一文件

我有 12 个脚本,每分钟使用 systemd 运行一次,每五秒运行一次。我需要添加某种缓存文件,以便当前运行的脚本不会请求与脚本相同的数据...

回答 1 投票 0

使用systemctl获取systemd进程的正常运行时间或停机时间?

就像使用 systemctl is-active 给出的是如果服务处于活动状态或失败,那么是否可以使用 systemctl 来获取 systemd 服务的正常运行时间或停机时间? 时间系统...

回答 3 投票 0

如何在创建 Linux 镜像时添加服务

我想将我的服务(简单的 C++ 应用程序)添加到 Linux 映像。 我知道如何在 Linux 运行时在控制台中添加服务(在 systemctl 的帮助下),但我需要制作已添加服务的 Linux 映像...

回答 2 投票 0

如何删除包含systemd服务文件的目录内容?

我有一个将文件存储在目录中的 systemd 服务。我需要确保每次服务启动时目录为空。我认为添加 ExecStartPre=+/bin/rm path/to/the/direct...

回答 2 投票 0

从 systemd 服务调用 pactl 总是报告“pa_context_connect() 连接失败被拒绝”

我已经设置了一个systemd服务文件来在系统启动时执行一些pactl操作以进行测试过程。虽然从终端执行命令时工作正常,但我总是得到“pa_context_connect()

回答 2 投票 0

为什么我的 Express 服务器代码在 systemd 外部运行时返回一个对象,但在 systemd 中运行时没有返回任何内容?

当我运行curl脚本并且我的express服务器代码在systemd之外运行时,会在我的数据库表中创建一条记录,并将一个json“用户”对象返回到stdout。当我的快递

回答 1 投票 0

如何配置systemd $PATH以匹配用户$PATH

我使用 systemd 在虚拟机上运行 Next.js 前端。我制作 systemd 服务的工作流程通常是: 使应用程序从用户 shell 运行(在本例中为 ec2-user) 编写一个单元文件,它可以...

回答 1 投票 0

防止将systemd服务日志转发到syslog而不影响发送到syslog的其他服务日志

我的计算机将多个java进程作为systemd服务运行。systemd日志在syslog中累积,最终导致磁盘空间不足。如何重定向由systemd服务启动的日志...

回答 7 投票 0

CentOS Stream 9 上 Podman 的 D-Bus 和 Systemd 问题

我在 CentOS Stream 9 上以非 root 用户“apideployer”使用 Podman 版本 4.8.1。我在尝试使用“systemctl --user daemon-reload&

回答 1 投票 0

如何列出archlinux中所有自启动服务?

我知道使用 systemctl status 来检查服务的特定状态,并使用 systemctl enable 在系统启动时将服务置于自动启动状态。但我怎样才能列出所有现有的自动...

回答 2 投票 0

Systemd http 健康检查

我在 Redhat 7.1 上有一个服务,我使用 systemctl 启动、停止、重新启动和状态来控制。有一次,systemctl 状态返回活动状态,但应用程序位于服务“后面”

回答 1 投票 0

如何可靠地检查我是否位于由“systemd-run --shell”调用的 systemd shell 内?

systemd-run 提供 --shell 标志,用于打开一个新会话。我经常测试高内存应用程序,我这样使用它: systemd-run --slice=restrict_memory.slice --shell --user 然后,当我运行

回答 1 投票 0

如何配置 systemd 服务定期重启? [已关闭]

我有一个简单的 systemd 服务,需要定期重新启动以防止其进程出错。 systemd 服务是否有一个配置选项可以定期重新启动它们?全部...

回答 7 投票 0

在 centos 7 启动时添加永久命令

我希望在我的 CentOS 7 服务器启动时运行 echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 因为我想重用打开的连接。 Systemd已经安装好了,但是我的命令不是服务,...

回答 2 投票 0

用于 Laravel 队列立即退出的 Systemd 服务

我正在尝试在 Amazon Linux 2023 实例上创建一个服务来为 Laravel 10 运行 mysql 数据库队列。由于各种原因,我无法使用 Supervisor,因此我使用 Systemd。 我正在升级 AMI,...

回答 1 投票 0

如何使用c++从sd-bus容器获取数据

在DBus.properties中使用GetAll方法时,结果为 大批 [ 字典条目( 字符串“ID” 变体字符串“cockpit.service” ) 字典条目( 斯特...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.