首页 > 解决方案 > systemd 不会从 bash 脚本运行应用程序

问题描述

我有一项服务应该在我的 Yocto 嵌入式 Linux 系统的后台运行一组应用程序。我不喜欢为每个应用程序创建一个 systemd 启动脚本,所以我只是从 bash 脚本运行它们,如下所示:

服务:

启动服务

[Unit]
Description=applications startup script
After=network.target

[Service]
Type=simple
ExecStart=/opt/somedir/startup.sh

[Install]
WantedBy=multi-user.target

和脚本

启动.sh

#!/bin/bash

echo "application startup script"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/somedir
/opt/somedir/app1 &
/opt/somedir/app2 &
/opt/somedir/app3 &

但是没有应用程序启动。检查服务状态给我:

systemctl status startup

● startup.service - applications startup script
   Loaded: loaded (/lib/systemd/system/startup.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2021-03-25 10:33:16 UTC; 18min ago
  Process: 428 ExecStart=/opt/somedir/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 428 (code=exited, status=0/SUCCESS)

Mar 25 10:33:16 systemd[1]: Started application startup script.
Mar 25 10:33:16 startup.sh[428]: application startup script
Mar 25 10:33:16 systemd[1]: startup.service: Succeeded.

所以服务在系统启动时执行并执行脚本。如果我从命令行执行脚本,它会按预期启动应用程序。那么没有应用程序运行的原因是什么?

标签: linuxsystemd

解决方案


Systemd 需要知道如何运行脚本。因此,要么添加:

#!/bin/bash

到 startup.sh 脚本的第一行或将 systemd 服务文件中的 ExecStart 行更改为:

ExecStart=/bin/bash -c /opt/somedir/startup.sh

此外,为了确保产生的进程在产生后保持持久性,请更改:

Type=forking

推荐阅读