【问题标题】:How to start a service with systemd in Raspbian Buster Lite which starts an felix (OSGi) program and holds the bundles active?如何在 Raspbian Buster Lite 中使用 systemd 启动服务,该服务启动 felix (OSGi) 程序并保持捆绑包处于活动状态?
【发布时间】:2019-11-26 09:57:26
【问题描述】:

我有以下问题:我有一个带有 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

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

【问题讨论】:

  • 您确定脚本startFelix.sh 没有崩溃吗?因为你的 systemd 单元对我来说看起来不错?
  • @tryingToLearn 是的,我在启动服务后查看了输出,脚本 startFelix.sh 启动正常且正常,但立即停止。如果我手动启动脚本,一切正常,直到我停止它才会停止。
  • 能否也添加startFelix.sh的内容?
  • @ChristianSchneider 完成了

标签: ubuntu raspberry-pi osgi systemd apache-felix


【解决方案1】:

你说

每个包启动后立即停止

我不知道你的意思是什么!你怎么知道它们是启动然后停止的?

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

如果您的捆绑包处于resolved 状态,那么它们确实解决了但没有启动。例如,这可能是因为 Framework Bundle Cache 的状态错误。或者可能是激活器中抛出了异常。

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

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

【讨论】:

  • 我是这样做的,但我不知道为什么它不起作用。
【解决方案2】:

我仍然不知道为什么它不能与 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"

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多