打印输出到终端

时间:2019-10-29 16:10:41

标签: linux bash shell

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

我已经发现可以打开一个终端并使其执行如下命令:

konsole -e command

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

亲切的问候 百事可乐

3 个答案:

答案 0 :(得分:0)

  

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

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

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

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

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

我正在tail -f的帮助下How to avoid echo closing FIFO named pipes? - Funny behavior of Unix FIFOs

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"