回送消息不在systemd的终端上

时间:2015-12-17 13:07:31

标签: linux console fedora tty systemd

我有systemd服务,比如xyzWarmup.service。

这是服务文件

[Unit]
Description=Xyz agent.
After=fooAfter.service
Before=fooBefore1.service
Before=fooBefore2.service

[Service]
# During boot the xyz.sh script reads input from /dev/console.  If the user
# hits <ESC>, it will skip waiting for xyz and abc to startup.
Type=oneshot
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/bin/xyz.sh start

RemainAfterExit=True
ExecStop=/usr/bin/xyz.sh stop

[Install]
WantedBy=multi-user.target

以下是xyz.sh的一部分。

#! /bin/bash                                                                                                                                                                                               
#                                                              
### BEGIN INIT INFO                                                                                                                                                                                         
# Required-Stop: Post                                                                                                                                                                                       
### END INIT INFO                                                                                                                                                                                           

XYZ=/usr/bin/Xyz
prog="Xyz"
lockfile=/var/lock/subsys/$prog
msg="Completing initialization"

start() {
     # Run wfw in background                                                                                                                                                                                 
    ulimit -c 0
    # wfw has a default timeout of 10 minutes - just pick a large value                                                                                                                                     
    wfw -t 3600 xyz abc >/dev/null 2>&1 &
    PID=$!

    # Display the message here after spawning wfw so Esc can work                                                                                                                                           
    echo -n $"$msg (press ESC to skip): "
    while [ 1 ]; do
        read -s -r -d "" -N 1 -t 0.2 CHAR || true
        if [ "$CHAR" = $'\x1B' ]; then
            kill -9 $PID 2>/dev/null
            # fall through to wait for process to exit                                                                                                                                                      
        fi

        STATE="`ps -p $PID -o state=`"
        if [ "$STATE" = ""  ]; then 
            # has exited                                                                                                                                                                                    
            wait $PID 2>/dev/null
            if [ $? -eq 0 ]; then
                echo "[ OK ]" 
                echo
                exit 0
            else
                echo "[ FAILED ]"
                echo "This is failure"  
                               exit 1
            fi
        fi
    done
}

在启动期间运行此脚本时,我会看到来自脚本的以下消息

 Completing initialization (press ESC to skip): 

更新: 这是我在前一行

之后看到的附加输出
[[  OK  ] Started Xyz agent.\n'

如果你仔细看,有两个空方括号(&#39; [&#39;),从这看起来似乎systemd正在覆盖日志消息。第一个&#34; [&#34;来自initscript&#34; [OK]&#34;。有人可以更好地解释一下吗?

我没有看到&#34; [确定]&#34;或&#34; [FAILED]&#34;在我的屏幕上。

当我在Fedora14中使用这个脚本作为initscript时,我常常看到这些消息。有一次,我转移到了systemd。我已经开始看到这个问题了。

systemd版本是:systemd-201-2.fc18.9.i686和systemd.default_standard_output = tty

请帮助。

1 个答案:

答案 0 :(得分:0)

在我看来,您的问题是该脚本永远不会附加到TTY。输出显示是因为您有硬编码转到脚本中的/dev/console。使用StandardInput=tty,systemd会等到tty可用,并且它可能已经在使用中。你的脚本只是坐在那里没有连接到无限循环中的输入。您可以尝试StandardInput=tty-force,我打赌这会有效,但我不确定 else 可能会破坏。

就个人而言,我想我可能会回过头来重新思考这种方法。听起来你希望启动完全阻止这项服务,但让你跳过逃生。也许有更好的方法吗?