systemd 没有 运行 来自 bash 脚本的应用程序
systemd doesn't run an application from bash script
我有一项服务应该 运行 在我的 Yocto 嵌入式 Linux 系统的后台设置应用程序。我不喜欢为每个应用程序创建 systemd 启动脚本的想法,所以我只是从 bash 脚本中 运行 它们,如下所示:
服务:
startup.service
[Unit]
Description=applications startup script
After=network.target
[Service]
Type=simple
ExecStart=/opt/somedir/startup.sh
[Install]
WantedBy=multi-user.target
和脚本
startup.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.
所以服务在系统启动时执行并执行脚本。如果我从命令行执行脚本,它会按预期启动应用程序。那么没有申请的原因是什么运行?
Systemd 需要知道如何 运行 脚本。因此要么添加:
#!/bin/bash
到 startup.sh 脚本的第一行或将 systemd 服务文件中的 ExecStart 行更改为:
ExecStart=/bin/bash -c /opt/somedir/startup.sh
此外,为确保生成的进程在生成后保持持久,更改:
Type=forking
systemd 运行脚本 startup.sh
,并且在该进程结束后,它假设一切都已完成,因此它会杀死所有剩余的进程并且该单元结束。最简单的解决方案是在 startup.sh
的末尾添加一个 wait
以便它仅在后台进程全部结束时 returns。
我有一项服务应该 运行 在我的 Yocto 嵌入式 Linux 系统的后台设置应用程序。我不喜欢为每个应用程序创建 systemd 启动脚本的想法,所以我只是从 bash 脚本中 运行 它们,如下所示:
服务:
startup.service
[Unit]
Description=applications startup script
After=network.target
[Service]
Type=simple
ExecStart=/opt/somedir/startup.sh
[Install]
WantedBy=multi-user.target
和脚本
startup.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.
所以服务在系统启动时执行并执行脚本。如果我从命令行执行脚本,它会按预期启动应用程序。那么没有申请的原因是什么运行?
Systemd 需要知道如何 运行 脚本。因此要么添加:
#!/bin/bash
到 startup.sh 脚本的第一行或将 systemd 服务文件中的 ExecStart 行更改为:
ExecStart=/bin/bash -c /opt/somedir/startup.sh
此外,为确保生成的进程在生成后保持持久,更改:
Type=forking
systemd 运行脚本 startup.sh
,并且在该进程结束后,它假设一切都已完成,因此它会杀死所有剩余的进程并且该单元结束。最简单的解决方案是在 startup.sh
的末尾添加一个 wait
以便它仅在后台进程全部结束时 returns。