Vadim Peretokin Asked: 2023-08-04 14:16:54 +0800 CST2023-08-04 14:16:54 +0800 CST 2023-08-04 14:16:54 +0800 CST 如何在计时器上启动和停止 systemd 服务? 772 虽然设置systemd在特定时间启动服务相对简单,但如何才能使其在不同时间停止? 这个想法是只在夜间运行服务,并在早上停止。 systemd 1 个回答 Voted Best Answer Artur Meinild 2023-08-04T14:53:44+08:002023-08-04T14:53:44+08:00 您是对的,systemd计时器的设计方式是使其在特定时间启动服务。因此,要使其停止服务,有必要采取解决方法。 幸运的是,有多种方法可以实现这一目标。 选项1:使服务A与服务B冲突 第一个选项是创建oneshot与服务 A 冲突的服务 B。这种方法的优点是仅依赖于systemd单元文件,但缺点是必须修改服务 A(或创建 drop-in 配置) 。 首先需要修改Service A的配置,使其与Service B冲突: 添加A.service的配置: [Unit] Conflicts=B.service ... 然后创建一个不执行任何操作的 B.service: [Unit] Description=B service description [Service] Type=oneshot ExecStart=/bin/echo '' 这个方法取自这个问答。 选项 2:让服务 B 直接停止服务 A 另一种选择是创建一个oneshot服务 B,只需运行命令来停止服务 A。这种方法的优点是不必修改服务 A,但缺点是它依赖于运行systemctl而不仅仅依赖于systemd单元文件。 对于这种方法,你只需要创建一个B.service,但是这次它会运行一个命令: [Unit] Description=B service description [Service] Type=oneshot ExecStart=/usr/bin/systemctl stop A.service 对于这两个选项,您可以为每个服务创建不同的计时器。计时器 A 现在将启动服务 A,计时器 B 随后将启动服务 B - 有效地停止服务 A。 有关设置服务和计时器的更多信息,请参阅此问答。systemd
您是对的,
systemd
计时器的设计方式是使其在特定时间启动服务。因此,要使其停止服务,有必要采取解决方法。幸运的是,有多种方法可以实现这一目标。
选项1:使服务A与服务B冲突
第一个选项是创建
oneshot
与服务 A 冲突的服务 B。这种方法的优点是仅依赖于systemd
单元文件,但缺点是必须修改服务 A(或创建 drop-in 配置) 。首先需要修改Service A的配置,使其与Service B冲突:
添加A.service的配置:
然后创建一个不执行任何操作的 B.service:
这个方法取自这个问答。
选项 2:让服务 B 直接停止服务 A
另一种选择是创建一个
oneshot
服务 B,只需运行命令来停止服务 A。这种方法的优点是不必修改服务 A,但缺点是它依赖于运行systemctl
而不仅仅依赖于systemd
单元文件。对于这种方法,你只需要创建一个B.service,但是这次它会运行一个命令:
对于这两个选项,您可以为每个服务创建不同的计时器。计时器 A 现在将启动服务 A,计时器 B 随后将启动服务 B - 有效地停止服务 A。
有关设置服务和计时器的更多信息,请参阅此问答。
systemd