簡體   English   中英

將 Output 打印到終端

[英]Print Output to terminal

有人碰巧知道是否可以將腳本的兩個echo命令打印到同一個終端? 問題是應該打印到終端的腳本是由systemd service自動執行的。

我已經發現可以打開一個終端並讓它執行一些這樣的命令:

konsole -e command

但是,這將為每個命令打開一個新終端,我希望它們都在同一個終端中執行。

親切的問候百事隆

問題是應該打印到終端的腳本是由 systemd 服務自動執行的。

...並且,因此,沒有關聯的終端:通常,系統服務寫入日志文件,而不是終端。

但是,您可以將回顯重定向到控制台 (/dev/console),它旨在成為唯一“始終存在”的終端。 否則,您可以重定向到您知道的任何終端 - 我的意思是 /dev/ttyS0 或類似的東西,如果您知道自己在做什么(並且您的腳本有權這樣做)。 在圖形環境中可以有任何東西,例如我的系統有大約 4 個文本終端,可以通過按 Ctrl-Alt-F1/2/3 等來查看。

關於如何處理沒有可用於捕獲日志的終端/X session 的情況的問題。 這些可以通過測試 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' & konsole -e '(tty; echo $$) > /tmp/active_tty; while true; do sleep 600; date; done' &
    • 有效地迫使終端熬夜直到關閉/被殺死。
    • 該文件將捕獲 tty 名稱和 PID
    • 可以使用 gnome-terminal, xterm, ...
  • 想要將 output 發送到“當前”日志終端的每個進程都應將 stdout 和/或 stderr 重定向到文件中指定的那個:
    • exec > $(head -1 /tmp/active_tty) 2>&1或類似

如果需要,PID 線可用於檢查終端 PID 是否仍在運行。

我建議使用在空間中使用mktemp創建的命名 pipe 用於臨時文件。 請注意, mktemp -u有點不安全。

我在幫助自己如何避免回聲關閉 FIFO 命名管道? - Unix FIFO 的有趣行為與該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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM