许多年前,我们可以将启动脚本写入/etc/rc.local. 加载所有系统服务后,您的脚本将运行。
现在,我们使用 systemd,我们没有rc.local了。Systemd 并行启动服务。您可以编写自己的服务来充当 rc.local`,但您不能确保它会在所有系统服务加载后运行。
有没有办法做到这一点?或者我们必须在systemd服务文件中使用Before和After?
小智 37
在 systemd 中,建议在其他服务周围很好地使用Before=和After=订购您的服务。
但是由于您要求一种不使用Beforeand 的方法After,您可以使用:
Type=idle
Run Code Online (Sandbox Code Playgroud)
这为man systemd.service解释道:
的行为
idle非常类似于simple; 但是,服务程序的实际执行会延迟,直到所有活动作业都被分派。这可用于避免 shell 服务的输出与控制台上的状态输出交错。注意,这种类型只对提高控制台输出有用,作为通用的单元排序工具没有用,而且这种服务类型的效果受到5s超时的影响,之后无论如何都会调用服务程序。
MCO*_*tem 10
确保我们的服务将在所有其他启用的服务之后执行的最佳方法是创建您自己的目标并使其在multi-user.target.
通常:
/etc/systemd/system/custom.target文件AllowIsolate=yes[Unit]
Description=My Custom Target
Requires=multi-user.target
After=multi-user.target
AllowIsolate=yes
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/last_command.service使用After=multi-user.target和创建您的服务单元文件WantedBy=custom.target[Unit]
Description=My custom command
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/local/bin/my_last_command.sh
[Install]
WantedBy=custom.target
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/custom.target.wants目录last_command.service到/etc/systemd/system/custom.target.wantsln -s /etc/systemd/system/last_command.service \
/etc/systemd/system/custom.target.wants/last_command.service
Run Code Online (Sandbox Code Playgroud)
systemctl daemon-reloadcustom.targetsystemctl set-default custom.target
Run Code Online (Sandbox Code Playgroud)
custom.targetsystemctl isolate custom.target
Run Code Online (Sandbox Code Playgroud)
这样,每次重新启动时,您的last_command服务将在multi-user.target达到后执行。
| 归档时间: |
|
| 查看次数: |
82644 次 |
| 最近记录: |