SystemD:配置单元文件,以便在服务退出并重新启动之前不显示登录屏幕

SystemD:配置单元文件,以便在服务退出并重新启动之前不显示登录屏幕

我有一个服务单元文件,用于安装和配置几个应用程序,并且需要在系统退出时重新启动系统。我正在将此脚本从 sysVinit 脚本迁移到 centOS 7.1 上的 systemD,但无法让系统登录屏幕等待脚本完成。

我尝试将 sysinit.target、basic.target、network-online.target 设置为RequiredBy、WantedBy、before、after,但它们都无法阻止登录屏幕,直到重新启动完成为止。

有没有人处理过这个问题或者知道哪个服务控制登录屏幕?

答案1

执行此操作的一种方法是使用 来指定您的服务在另一个服务之前启动Before=。在这种情况下,因为没有 GUI,并且您想要阻止控制台登录,所以您需要使用[email protected]. (但请注意,这是一个参数化服务,在本例中, 后面的部分@代表要在什么设备上运行getty)。例如:

[Unit]
Description=Run script to set up environment
[email protected] [email protected] [email protected] [email protected] [email protected] [email protected]

[Service]
Type=oneshot
ExecStart=/bin/myscript

这将确保您的脚本getty在 TTY 1-6 上启动之前运行。

或者,您可以创建一个(空)文件来告诉[email protected] 不是启动。这样做的优点是它会自动将条件添加到 的所有实例getty,而不仅仅是 1-6。

为此,请先在服务启动之前创建该文件:

[Unit]
Description=Run script to set up environment

[Service]
Type=oneshot
ExecStartPre=/bin/touch /etc/no-login-console
ExecStart=/bin/myscript
ExecStopPost=/bin/rm /etc/no-login-console

然后,运行。这将打开您的编辑器并创建一个“覆盖”文件,该文件将有效地附加到主服务文件中。这样,您可以对服务进行自己的自定义,但仍然能够使用 CentOS 的最新版本的服务文件。在打开的编辑器中输入:systemctl edit [email protected]

[Unit]
ConditionPathExists=!/etc/no-login-console

这告诉服务仅在/etc/no-login-console不存在时启动。保存并退出编辑器。当您运行时,您应该看到主服务文件,然后是您的覆盖。systemctl cat [email protected]

编辑:它看起来像CentOS 7.1 中附带的版本,systemctl edit但不可用。相反,运行(其中是服务文件的路径)并将上述文本添加到文件中。然后,运行,然后运行​​.输出应表明已读取插入文件。systemctl catsystemdsudo vim /lib/systemd/system/[email protected]/condition-path.conf/lib/systemd/system/[email protected]systemctl daemon-reloadsystemctl status getty@

答案2

在 Ubuntu 16.04 上它是display-manager服务。例如:

[Unit]
Description=Purge home
Before=display-manager.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/clean-home.sh

[Install]
WantedBy=display-manager.service

相关内容