画面でコマンドを実行してデタッチする方法は?


75

画面を取得してコマンドを実行してから切り離すにはどうすればよいですか(つまり、スクリプトを最初に起動する以外に入力を行わなくても、単一のスクリプトで自動的に実行できます)。たとえば、myscript.shを実行すると、自動的にスクリーンセッションが開始され、コマンドが実行されてから切り離されます。

回答:


114

これは簡単です:

screen -d -m yourcommand

4
サイコロなし。screen -d -mコマンド、screen -listはソケットなし、screen -rはセッションなし
-darkfeline

1
どういうわけか、コマンドが見つからなかったか、自動作成された画面環境で正しく機能していません。and screen yourcommandなしでやってみて、それが最初にどうなるか見てみましょう。-d-m
アランカレー

あなたは一種の権利です。私の期待に反して、コマンドが終了すると画面が終了します。しかし、あなたの答えはうまくいきます。
-darkfeline

3
zombie画面のオプションを有効にすることで変更できます。を入れzombie xyてください~/.screenrc。また、あるセッションzombie xyで別のファイルを挿入して使用するだけで有効にすることもできます-c fileが、何らかの理由で試してみても動作しません。または単に使用するsh -c 'yourcommand;while :;do sleep 9999; done'
アランカレー

@AlanCurry、いや、これは私にとっても機能しません。画面で手動で実行するとコマンドが完全に実行されます(数時間かかります)。
セリン14

47

画面で単一のコマンドを実行してデタッチするには、次を試してください。

screen -dm sleep 10

複数のコマンドを実行するには、次を試してください:

screen -dm bash -c "sleep 10; myscript.sh"

プログラムが終了すると、screenは(デフォルトで)それを含むウィンドウを強制終了することに注意してください。

スクリプトの終了後にセッションが強制終了されないようにするにexec shは、最後に追加します。例:

screen -dm bash -c 'sleep 5; exec sh'

すべてのセッションをリストするには、次を試してください。

screen -list

関連:Unix画面の起動、コマンドの実行、分離


2
これは、Ubuntu 16.04で機能しました。後で戻ることができるようにセッションに名前を付けることに加えて、-S sessionname:を追加しますscreen -dmS MyLongRunningScript bash -c "..."
ダンダスカレスク

16

「sleepy」という名前でバックグラウンドで新しいセッションを開始するには

screen -S sleepy -dm sleep 60

「眠い」セッションを殺すために

screen -S sleepy -X quit      

なぜ機能しないのscreen -S sleepy -dm "cd myfolder;sleep 60"ですか?
ツールキット

@Toolkit問題は、引用符で囲まれたコマンドがあるため、1つの大きなコマンドとして扱われたことです。セミコロンのため、明らかに引用符から取り出すことはできません。これを解決するには、次のようなコマンドを実行します。screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Jason Thompson

3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'

0

コントロールc(sig int)を押してプログラムを終了したときに起こります。すべてのbashから終了します。SIGINTをキャッチするためにこれを見つけました。最後のbashからの終了を防ぎます。(終了するにはexitと入力する必要があります)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

cronを使用して、起動時にnodejsプログラムを実行すると便利です。起動時に画面を実行します。cronには、特別なイベントの構文@reboot eventがあります

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.