题 等待systemd oneshot服务完成


我正在进行一些服务器配置,我需要在安装后运行脚本,因为它需要系统完全正常运行,包括服务。所以我不能把它放进去 %post 我的kickstart文件的一部分。

相反,我已经创建了一个systemd服务,它将自己禁用为最后一件事。

[Unit]
Description=Prepare the system after installation

[Service]
Type=oneshot
ExecStart=/usr/bin/prepare-system

[Install]
WantedBy=multi-user.target

问题是,在第一次启动时,我进入登录提示,甚至可以登录并开始使用系统,而“第一启动脚本”仍在运行。

这使管理员可以为系统设置系统完成的错觉,但实际上并非如此。

我希望服务延迟启动,最好显示一条消息,如“正在准备系统,请稍候......”并等待,直到脚本完成。


5
2018-02-24 14:59




登录提示会在系统启动许多操作之前出现,例如网络。与以前相比,Startup与systemd的高度并行性更高。如果这样做,您可能会在启动无关服务时引入冗长(可能不必要)的延迟。小心。 - Michael Hampton♦


答案:


假设您使用GDM作为登录管理器,请添加一行 Before=gdm.service 在里面 [Unit] 部分。

如果你不使用gdm,找出哪个服务启动xorg并将其放入 Before= 线。

这将导致任务在登录管理器显示之前完成。


1
2018-02-24 17:37



这是一台没有X的服务器。我试着设置 WantedBy=default.target 而是添加 Before=multi-user.target 但是在脚本运行完毕之前我仍然会进入登录提示符。 - Christoffer Reijer


在这里找到答案: https://unix.stackexchange.com/questions/216045/systemd-configure-unit-file-so-that-login-screen-is-not-shown-until-service-exi

刚设置 Before 当终端可用时:

[Unit]
Description=Prepare the system after installation
Before=getty@tty1.service getty@tty2.service getty@rrt3.service getty@tty4.service getty@tty5.service getty@tty6.service

[Service]
Type=oneshot
ExecStart=/usr/bin/prepare-system

[Install]
WantedBy=multi-user.target

1
2018-02-24 18:32