如何让一个 systemd 服务在完成后触发另一个 systemd 服务?

如何让一个 systemd 服务在完成后触发另一个 systemd 服务?

我有两个进程需要在不同的条件下运行(Service1 必须从特定的 TTY 运行,而 service2 不能在该 TTY 下运行。),因此它们必须从不同的 systemd 服务运行。但我希望他们背靠背跑。所以我想用计时器触发service1,但然后我希望在service1之后立即触发service2。

有没有一种优雅的方式来实现这一目标?

服务1

[Unit]
Description=blank the cursor

[Service]
StandardInput=tty-force 
StandardOutput=tty 
TTYPath=/dev/tty1 
Type=simple 
ExecStart=tput civis > /dev/tty1

服务2

[Unit]
Description=random wallpaper change script

[Service]
SyslogIdentifier=wallpaper.sh
User=deanresin
Type=simple 
ExecStart=/bin/bash /home/deanresin/scripts/wallpaper.sh

我希望service1在完成后触发service2。

答案1

service1完成后触发service2

您可以从 service1 实现此关系,也可以从 service2 实现此关系。

在服务中实现它1

[Unit]
Before=service2.service
Wants=service2.service # Start service2 after this service

从service2来实现

[Unit]
After=service1.service
BindsTo=service1.service # Only starts if service1 exits with success

[Install]
WantedBy=service1.service # Creates a Wants dependency in service1

源systemd单元手册: https://www.freedesktop.org/software/systemd/man/systemd.unit.html

答案2

Arch Linux wiki 用于建议以下内容以在 certbot 更新后触发 HTTP 服务器的重新加载:

ExecStartPost=/bin/systemctl reload nginx.service

我不会说这是“优雅的”,但添加以下内容service1.service可以做你想做的事情:

ExecStartPost=/bin/systemctl start service2.service

相关内容