如何在 Raspbian Buster Lite 中使用 systemd 启动服务,启动 felix (OSGi) 程序并保持捆绑包处于活动状态?

How to start a service with systemd in Raspbian Buster Lite which starts an felix (OSGi) program and holds the bundles active?

我有以下问题:我有一个 Raspberry Pi 和 Raspbian Buster Lite 操作系统。我想自动启动一个以 Raspberry Pi 开头的程序。

我正在尝试通过在文件夹 /etc/systemd/system 中创建服务来使用 systemd。我要启动的程序是一个用于启动 OSGi-Bundles 的 Apache Felix 文件。如果我在 Raspberry Pi 上启动此文件,一切正常。通过使用 systemd 启动程序,服务处于活动状态,但 Felix 文件的包在每个包启动后立即停止。我希望捆绑包保持活跃。我尝试了很多东西,这里有一个例子:

[Unit]
Description=Service to run felix

[Service]
User=module
Group=module
Type=simple
WorkingDirectory=/home/module/apache-felix-6.0.2/apache-felix-6.0.2
ExecStart=/home/module/apache-felix-6.0.2/apache-felix-6.0.2/startFelix.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

这样,如上所述,服务处于活动状态,但捆绑包在成功启动后全部停止。我还尝试了分叉和 RemainAfterExit = yes。仍然是同样的问题。经过研究,我发现使用服务类型 oneshot 和 RemainAfterExit = yes 服务在启动后保持活动状态。但这并没有解决问题,因为尽管服务仍在运行,但 Felix 文件的捆绑包已停止。我还尝试将 KillMode 设置为 none 并将 KillSignal 设置为默认操作是忽略信号的信号,但它也不起作用。我将 KillSignal 设置为 SIGCHLD。

这里是 startFelix.sh 脚本:

#!/bin/bash

java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8182 -Dlogback.configurationFile=conf/logback.xml -jar ./bin/felix.jar

如何让捆绑包保持活动状态?有人有想法吗?

你说

immediately stopped after every bundle started

我不知道你说的是什么意思!您如何知道它们已启动然后停止?

如果您的捆绑包处于 installed 状态,那么它们可能无法解析。这可能是由于对给定 OS、Java 版本、体系结构...

的要求

如果您的包处于 resolved 状态,那么它们确实已解析但没有启动。例如,可能是因为 Framework Bundle Cache 的状态错误。也可能是激活器抛出异常

根据您提供的信息,这真的很难说。我要做的是:

  1. 确保一切都在开发友好的环境中运行
  2. 在 Raspberry Pi 上手动安装并在 运行 上手动安装(确保您也安装了 GogoShell,以便您可以检查 运行 时间)并检查所有工作是否正常。
  3. 添加 systemd 脚本,如果只是将状态与上一步进行比较,就会出现问题。

我仍然不知道为什么它不能与 systemd 一起使用,但我在 supervisor 上尝试过它并且一切正常而无需停止捆绑包。

配置文件如下所示:

[program:felix]
command = /home/module/apache-felix-6.0.2/apache-felix-6.0.2/startFelix.sh
directory = /home/module/apache-felix-6.0.2/apache-felix-6.0.2
user = module
autostart = true
stdout_logfile = /home/module/supervisor/felix.log
stdout_logfile_maxbytes=500KB
stdout_logfile_backups=1
stderr_logfile = /home/module/supervisor/felix_err.log
stderr_logfile_maxbytes=500KB
stderr_logfile_backups=1
environment = HOME="/home/module/apache-felix-6.0.2/apache-felix-6.0.2", USER="module"

我意识到这真的很旧,但我发现我遇到麻烦的原因是因为 gogo shell 真的不喜欢 运行 没有 tty。如果将 -Dorg.jline.terminal.dumb=true -Dgosh.args=--nointeractive 放入 felix 的命令行参数中,它会更快乐。