我有一个服务单元文件,用于安装和配置几个应用程序,并且需要在系统退出时重新启动系统。我正在将此脚本从 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 cat
systemd
sudo vim /lib/systemd/system/[email protected]/condition-path.conf
/lib/systemd/system/[email protected]
systemctl daemon-reload
systemctl 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