Terminal

使用 cron 在終端上啟動程序而不使用螢幕?

  • July 14, 2015

我想使用 cron 在終端中啟動一個程序。我希望程序在終端中啟動,這樣我就可以在終端上連續看到程序的輸出,並殺死它/重新啟動它等。我知道我可以通過螢幕執行此操作,使用“screen -p -X東西”,但我最近遇到了螢幕凍結的奇怪問題(螢幕會話凍結,輸出停止,但程序繼續執行。可能回收螢幕?),並且想知道是否有辦法通過 cron 啟動程序不使用螢幕的終端?如果有幫助,我可以事先創建終端並手動重命名它等。

這是一個解決方案,它將為您unlockpt()創建一個新的 pty 描述符並將其寫入ptsname()標準輸出。

<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
       if(unlockpt(0)) return 2;
       char *ptsname(int fd);
       printf("%s\n",ptsname(0));
       return argc - 1;
}
C

它只是編譯了一個很小的 C 程序,它試圖呼叫unlockpt()它的標準輸入,如果成功則列印新創建和解鎖的 pty 的名稱,stdout否則靜默返回 2。

在 linux 系統上 - 給定適當的權限*(通常,這些最容易通過將自己添加到tty組中來實現)* - 一個新的 pty 描述符可能很容易獲得……

exec 3<>/dev/ptmx

…然後在目前 shell 中獲取主端 fd,前提是您已經在./…中編譯了上面的程序

slave=$(./pts <&3)

…將使您的新描述符實際可用並將其設備名稱放入 shell 變數的值中$slave

接下來,如果該*util_linux*軟體包已安裝在您的系統上,您可以在那里安裝一個新setsid()程序,例如:

setsid -c sh 3>&- <>"$slave" >&0 2>&1

它將作為您的 pty 的會話負責人啟動一個互動式sh程序並退出,本質上是互動式 shell。後台 shell 會將寫入的任何內容解釋>&3為使用者輸入。一個特別有用的東西可能看起來像:

echo "exec >$(tty) 2>&1" |
cat   - /dev/tty    >&3

將後台 shell 及其子項的所有輸出臨時重定向到目前終端,同時將所有鍵盤輸入重定向回後台 shell,只要cat存在。但是,後台 shell/dev/tty是 slave 中的 pty,因此恢復現狀很容易,如下所示:

echo 'exec >/dev/tty 2>&1' >&3

同樣的事情可以從 . 開始工作cron,但是您當然只需要編寫 i/o 腳本,或者設置一些管道中繼來自動為您做雜耍。

請參閱我如何通過此 pty 來,我能用它做什麼?更多。

引用自:https://unix.stackexchange.com/questions/213598