Linux

如何在螢幕中執行程序,將所有輸出重定向到文件並分離

  • October 4, 2021

在螢幕中執行命令並分離非常簡單。

screen -S test -d -m echo "output of command that runs forever"

但是,我還想將所有輸出通過管道傳輸到一個文件以進行日誌記錄,如何在螢幕中執行以下內容並分離。

echo "output of command that runs forever" &> output.log

編輯:

只是為了澄清一下,我需要這個腳本來如此簡單地啟動螢幕並執行命令並分離不是一種選擇。

螢幕 -dms 工作區;screen -S 工作區 -X stuff $‘ps aux > output-x\n’

我首先使用 -d 開關創建了一個分離的會話,我呼叫了我的會話工作區。然後我用 -X 東西將我的命令發送到同一個會話,我使用的是 $’’,但你也可以使用雙引號,但必須使用控制 M 而不是 \n,我不喜歡這樣,所以我通常使用我上面描述的方法。

這段程式碼執行後,您將找到帶有程序列表的 output-x,如果您執行以下操作:

螢幕-ls

您將看到會話已分離。

既然你說你將要執行一個腳本。您可能希望讓腳本搜尋分離的會話(我正在使用工作區),如果存在,則向該預先存在的會話發送命令,而不是每次執行“screen -dmS sessionName”時都創建一個新會話,例如在下面:

   #!/bin/bash
   if ! ( screen -ls | grep workspace > /dev/null); then
      screen -dmS workspace;
   fi
   screen -S workspace -X stuff $'ps aux > output-x\n'

您可以將您的命令包裝在一個額外的bash(或您的實際 shell)呼叫中並在那裡進行重定向:

$ screen -dm bash -c 'echo hello > ./out'
$ cat ./out
hello

來自man screen

-d -m 以“分離”模式啟動螢幕。這會創建一個新會話,但不會附加到它。這對於系統啟動腳本很有用。

命名會話

可能適合命名您的後台作業以消除它們的歧義,screen -ls並在必要時附加:

$ screen -S mysession -dm sleep 20
$ screen -ls
8431.mysession  (10/04/2021 12:47:58 PM)    (Detached)

# attach
$ screen -r mysession

如何傳遞參數

不過,參數化可能很麻煩。傳遞的參數以bash開頭$0- 注意ignore_me_arg

# note the outer-most quotes to be single -- we don't want them to
# be expanded on the caller's side, but on the callee's one

$ screen -dm bash -c 'echo $1 > ./out' ignore_me_arg hello
$ cat ./out
hello

作為最後一個範例,假設您有一個程序super_script執行某些操作並將其所有參數列印到stdout(就像echo會那樣)。你想在裡面呼叫它screen,做一個重定向,然後用不同的參數集做所有的爵士樂。那麼這應該這樣做:

$ screen -dm bash -c 'super_script "$@"  > ./out.1' arg0 arg1
$ screen -dm bash -c 'super_script "$@"  > ./out.2' arg0 arg1 arg2
... wait for screen's to finish
$ cat out.1
arg1
$ cat out.2
arg1
arg2

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