在 multi-user.target 之后但在登录屏幕之前使用 systemd 执行交互式(whiptail)脚本

在 multi-user.target 之后但在登录屏幕之前使用 systemd 执行交互式(whiptail)脚本

我正在尝试在 Fedora 19 上从 systemd 运行一个小型交互式配置脚本。它必须以 root 身份运行,并在用户登录之前运行。我创建了一个看起来像这样的服务:

[Unit]
Description=blah
Before=graphical.target 

[Service]
Type=oneshot
ExecStart=/path/to/script.sh

[Install]
RequiredBy=multi-user.target

为了简单起见,脚本如下所示:

#!/bin/sh
whiptail --msgbox "test" 0 78

但是当我加载此服务并重新启动时,脚本输出未显示,并且在 /var/log/messages 中它建议设置 TERM 变量。但我原本希望脚本在第一个虚拟终端上运行。

任何建议或见解都将不胜感激。

答案1

您忽略了守护进程的一个基本概念:它们通常没有控制终端。它们没有用于终端设备的打开文件句柄。任何期望与“终端”对话的东西都不会这样做。没有“终端”。

不,$TERM没有指定“终端”。它指定终端类型,即发送哪些转义序列作为输出并解释为输入。这里需要它,您必须安排将其设置为适当的值。但这不是这里的主要因素。主要因素是没有“终端”。

是的,输出结果为/var/log/messages。服务的标准输出默认为 下的日志systemd,而您显然正在syslogd运行某种 。您只在$TERM设置 后才看到此信息,这仅仅意味着您的脚本已经更进一步,超越了需要知道终端类型才能确定如何输出内容的部分。

systemd确实有能力将守护进程附加到终端。它必须有。它agetty作为守护进程运行,以在虚拟终端上提供登录会话。

您正在寻找的是StandardInput=StandardOutput=, 和TTYPath=设置,将其添加到问题中的单元文件中。查看它们的使用情况。/usr/lib/systemd/system/[email protected]

你的问题没有提供足够的信息来说明这是否是正确的方法,或者你是否应该添加一个ExecStartPre=自定义。这完全取决于这是在启动 GUI 之前运行一次,还是在每次个人 (TUI) 登录之前运行一次。 暗示前者,但这可能不是你真正想要的(考虑到)。☺/etc/systemd/system/[email protected]Before=graphical.targetRequiredBy=

相关内容