画面上でコマンドを実行および分離するのは非常に簡単です。
screen -S test -d -m echo "output of command that runs forever"
しかし、ロギングのためにすべての出力をファイルにパイプしたいと思います。画面上で以下を実行して分離するにはどうすればよいですか?
echo "output of command that runs forever" &> output.log
編集する:
明確にするために、単に画面を起動してコマンドを実行するにはこのスクリプトが必要です。分離はオプションではありません。
答え1
追加bash
(または実際のシェル)呼び出しでコマンドをラップしてそこにリダイレクトできます。
$ 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
答え2
screen-dmsワークスペース; screen-S ワークスペース-X もの $'ps aux > 出力-x\n'
まず、-dスイッチを使用して別々のセッションを作成します。これをセッションワークスペースと呼びます。次に、-X を使用して同じセッションにコマンドを送信します。 $ ''を使用しますが、二重引用符を使用することもできますが、\ nの代わりにMを制御する必要があります。気に入らないので、通常上記の方法を使用してください。
このコードが実行されると、プロセスのリストとともに出力-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'
答え3
あなたは使用することができますdisown
またはnohup