【问题标题】:Print Output to terminal打印输出到终端
【发布时间】:2020-02-24 22:10:47
【问题描述】:

是否有人碰巧知道是否可以将脚本的两个echo 命令打印到同一个终端?问题是应该打印到终端的脚本是由systemd service自动执行的。

我已经发现可以打开一个终端,让它执行一些这样的命令:

konsole -e <strong>command</strong>

但是,这将为每个命令打开一个新终端,我希望它们都在同一个终端中执行。

亲切的问候 百事乐

【问题讨论】:

  • 可能会重定向到tty。喜欢echo hello &gt; $(tty)。未经测试的建议
  • 把你需要的东西放在一个脚本中,然后使用konsole -e /path/to/myScript ?或者也许你可以用 konsole -e 'echo one ; echo two' 内联它?祝你好运。

标签: linux bash shell


【解决方案1】:

我建议使用在空间中使用mktemp 创建的命名管道来存储临时文件。请注意,mktemp -u 有点不安全。

我用How to avoid echo closing FIFO named pipes? - Funny behavior of Unix FIFOs 用那个tail -f 帮助自己:

our_named_pipe=$(mktemp -u) &&
mkfifo $our_named_pipe && {
    tail -f > $our_named_pipe & # is holding pipe open
    named_pipe_holder_pid=$!
    echo $our_named_pipe # outputting in case you would want to unsafely use it outside 
    mate-terminal -e \
    "bash -c \"cat $our_named_pipe; echo 'Finished, press enter to exit'; read\"" && {
        echo "Do things, everythings fine" > $our_named_pipe
        sleep 10 > $our_named_pipe
    } || echo "You got an error from the terminal emulator"
    kill -9 $named_pipe_holder_pid
} || echo "you got an error from mkfifo"

【讨论】:

    【解决方案2】:

    在没有可用于捕获日志的终端/X 会话时如何处理情况的问题放在一边。这些可以通过测试 X/终端可用性并回退到日志文件来解决。

    每个终端都连接到唯一的伪终端 (PTY),通常是 /dev/pts/0, /dev/pts/1, ..., 。发送到 PTY 的任何内容都将显示在终端上(konsole、gnome-terminal、xterm、...)。

    您可以使用以下方法构建解决方案

    • 使用以下命令启动终端:
      • konsole -e '(tty ; echo $$) &gt; /tmp/active_tty ; while true ; do sleep 600 ; date ; done' &amp;
      • 有效地强制终端熬夜直到关闭/被杀死。
      • 该文件将捕获 tty 名称和 PID
      • 可以使用 gnome-terminal、xterm、...
    • 每个想要将输出发送到“当前”日志终端的进程都应该将 stdout 和/或 stderr 重定向到文件中指定的那个:
      • exec &gt; $(head -1 /tmp/active_tty) 2&gt;&amp;1 或类似

    如果需要,PID 行可用于检查终端 PID 是否仍在运行。

    【讨论】:

      【解决方案3】:

      问题是应该打印到终端的脚本是由 systemd 服务自动执行的。

      ...因此,没有关联的终端:通常,系统服务写入日志文件,而不是终端。

      但是,您可以将回显重定向到控制台 (/dev/console),它旨在成为唯一“始终存在”的终端。否则,您可以重定向到您知道的任何终端 - 我的意思是 /dev/ttyS0 或类似的东西,如果您知道自己在做什么(并且您的脚本有权这样做)。在图形环境中可以有任何东西,例如我的系统有大约 4 个文本终端,可以通过按 Ctrl-Alt-F1/2/3 等来查看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 1970-01-01
        • 2014-11-29
        • 1970-01-01
        • 2013-06-27
        相关资源
        最近更新 更多