我正在尝试在 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.target
RequiredBy=