Bash

許多腳本實例可以寫入 tty(並行)嗎?

  • June 6, 2020

我最近將我的upstart腳本遷移到了systemd,與此不同的是,我在啟動/停止服務upstart時看不到任何輸出。為了獲得視覺回饋,我添加了類似tty

     echo "Starting $UNIT_NAME" > $MYTTY

其中MYTTY是我從tty命令輸出設置的環境變數。我有 20 多種服務,但不知何故,並非所有消息都出現在我的 tty 上。所以我將行(只是為了檢查)更改為:

     echo "Starting $UNIT_NAME" | write myuser $MYTTY

有了這個,我看到所有的消息都在顯示!(當然,還有額外的 Message from <user>@<hostname> on <term> at <time> ... EOF

只是為了檢查是否write在做一些特別的事情,我檢查了程式碼,bsdutils我沒有發現任何特別之處,它只是逐個字元地編寫(對特殊字元和 CR、LF 進行了一些處理)

出什麼問題了 :

     echo "Starting $UNIT_NAME" > $MYTTY

? 我也試過:

     echo -e "Starting $UNIT_NAME\r\b" > $MYTTY

等等,但我仍然沒有在螢幕上看到來自所有服務的消息!是不是因為並行systemd啟動了所有服務,所以一些寫入 tty 的內容消失了!?

  • 編輯 -

以下回合的方式似乎有效!但我想知道這是否安全或有更好/更簡單的東西

mkfifo /tmp/ttyfifo
(cat > $MYTTY < /tmp/ttyfifo &) && echo -e 'Starting $UNIT_NAME\r\n'  > /tmp/ttyfifo

理論上是的,因為請求似乎已排隊並且描述符未鎖定,因此最好使用TTYBUS Multiplexer 之類的東西,因為並發寫入文件/fifo 可能會弄亂換行符等。

引用自:https://serverfault.com/questions/1019012