web-dev-qa-db-ja.com

子を殺さずに(最初に「screen」を実行せずに)端末を閉じるにはどうすればよいですか?

アプリをgnome-terminalで実行することもありますが、突然gnomeなどを再起動する必要があります。質問への回答も役に立つと思います。何かが起こっているところでSSHから切断したいと思います。

Gnomeのターミナルツリーは次のようになります。

gnome-terminal
    bash
        some-boring-process

bashgnome-terminalから「切り離す」ことはできますか(またはsome-boring-processをbashから切り離し、その出力をどこかにリダイレクトできますか)? gnome-terminalを強制終了した場合、bashはすべてのサブプロセスを強制終了するために強制終了されます

36
valya

現在のbashセッションでsome-boring-processが実行されている場合:

  1. ctrl-zで停止すると、bashプロンプトが表示されます
  2. bgでバックグラウンドに配置します
  3. ジョブ番号を書き留めるか、jobsコマンドを使用します
  4. このbashセッションからプロセスをdisown -h %1で切り離​​します(そこで実際のジョブ番号を置き換えます)。

それは出力をリダイレクトするために何もしません-退屈なプロセスを起動するときそれを考えなければなりません。 [編集]それをリダイレクトする方法があるようです https://Gist.github.com/78226

しかし、真剣に、画面を見てください。何ヶ月も実行されているリモートサーバー上のシェルがあります。

49
glenn jackman

これがまさに screen および tmux が作成された目的です。 screen/tmuxセッション内でシェルを実行し、自由に切断/再接続できます。 1つのgnome-terminal内で複数のシェルセッションを実行することもできます。

10
jsbillings

screentmux 、または dtach (おそらく dvtm )はすべてこれに最適ですが、これらのいずれかを使用することを考えていなかった場合は、活用できる可能性があります Nohup

6
Hank Gay

単にバックグラウンドで子プロセスを操作し続けるのではなく、対話を続けたい場合、実際には retty と呼ばれるプログラムがあり、これはプロセスを「盗む」ための概念実証です現在のttyと現在のものに再接続します。

ただし、再接続されたアプリケーションのスタックにアセンブリコードを貼り付けるなど、恐ろしいことをいくつか行います。そして、そのコードはx86_64用に更新されていません。

多分もっと良いアプローチを取る別のプログラムがあり、ユーザースペースのプロセスをファイルにフリーズし、そこから後で(おそらく別のttyで)復元できます。これは cryopid であり、そのプロジェクトまた、概念実証段階で停止したようで、コードが現状では最新のLinuxでは動作しません。まぁ。

これは完全にするためにここにあるべきだと思っただけです。あなたが恐ろしいブードゥー教に頼ることを気にしなければ、これは可能性の領域内にあります-少なくとも理論的な可能性。

4
mattdm

(システムの再起動を除いて)何でも終わらせたいものを起動した場合、Nohupを使用してバックグラウンドで実行します。画面などとは異なり、プロセスに再アタッチすることはできません。ただし、他の場所でのリダイレクトの禁止は、出力がNohup.out

プロセスのターミナルを切り替えられるようにしたい場合は、screenを使用します。自宅や職場からプロセスを開始し、他のプロセスに切り替えるなど。他の端末セッションの出力と同様に、最終的にはバッファーの上部からスクロールされます。

編集:プロセスをすでに起動している場合は、プロセスをdisownして、プロセスが閉じるときにHUPシグナルが送信されないようにすることができます。

2
BillThor

端末セッションが終了したときに、プロセス(PID)がHUPシグナルを受信しないようにすることができます。次のコマンドを使用します。

Nohup -p PID
1
tony

このスクリプトは、子プロセスを親から切り離し、それをinitプロセスに割り当てます。

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
1
mark_infinite