子を殺さずに(最初に `screen`を実行せずに)どうやって端末を閉じることができますか?


35

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

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

gnome-terminal
    bash
        some-boring-process

缶I「デタッチ」bashからgnome-terminal(またはデタッチsome-boring-processのbashから、その出力どこかにリダイレクト)?私が単に殺すとgnome-terminalbashそのすべてのサブプロセスに殺されます


回答:


48

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

  1. 停止してctrl-zbashプロンプトを表示します
  2. バックグラウンドでそれを置きます bg
  3. ジョブ番号をメモするか、jobsコマンドを使用します
  4. このbashセッションからプロセスをデタッチしますdisown -h %1(実際のジョブ番号をそこに置き換えます)。

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

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


ありがとうございました。私はあなたの答えを選んだのは、それが質問に答える唯一のものだからです(すでに実行中のプロセスに関するものでした)。私はすでにscreen問題を抱えていますが、私の人生のすべての bashセッションにそれを使いたくはありませんが、すでに使用しています
-valya

すべてのbashセッションに使用するのではなく、多くの時間を費やすすべてのリモートマシンに使用します。
グレンジャックマン

出力のリダイレクトに関する情報を追加する自由を取りました。レビューしてください!
-valya

[root @ server〜]#bg -bash:bg:current:no
such

どうして手に入れたのbash: bg: current: no such job
ムハンマドディアスヤスクル

10

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


ありがとう、しかし、私が受け入れられた答えにコメントしたとき:1.質問はすでに実行中のプロセスについてでした。2. screen問題があり、私の人生のすべてのbashセッションでそれを使用する気はありません
-valya

6

screentmuxまたはdtach(多分にdvtm)このため、すべての素晴らしいですが、あなたは考えていなかったことの何かが、それらのいずれかを使用する場合は、活用することができるかもしれませんnohup


ありがとう、しかし、私は受け入れられた答えにコメントしたように:1.質問はすでに実行中のプロセスに関するものでした。2. screen問題があり、私の人生のすべてのbashセッションにそれを使用する気はありません
-valya

@valya解決策を見つけてくれてうれしい。ただし、明確にnohupするために、-pオプション(使用可能な場合)を使用して、実行中のプロセスで動作します。
ハンクゲイ

@Hankゲイ:manページに-pオプションが表示さnohupれません。どのシステムにいますか?
ミケル

@Mikel心配するのをやめて、愛することを学ぶ前に、Solarisボックスでオプションtmuxを使用し-pました。また、雑種のCentOSボックス(おそらくzshそれをサポートするビルトインがありますか?)でそれを行うことについての漠然とした思い出もありますが、そのドキュメントは見つかりません。
ハンクゲイ

@Hank Gay:私のUbuntu Linuxシステムでも、提供していませbashん。zshnohup
ミケル

4

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

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

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

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


1
それはgist.github.com/782263を思い出させます...ああ、その要点も私の質問に答えているようです
valya

2

(システムの再起動の手間がかからず)終了したい何かを起動した場合nohup、それを使用してバックグラウンドで実行します。画面などとは異なり、プロセスに再接続することはできません。ただし、他の場所でのむき出しのリダイレクトは、にありnohup.outます。

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

編集:既にプロセスを起動している場合、プロセスが終了したときに信号が送信されdisownないようにプロセスを実行できHUPます。


ありがとう、しかし、私は受け入れられた答えにコメントしたように:1.質問はすでに実行中のプロセスに関するものでした。2. screen問題があり、私の人生のすべてのbashセッションでそれを使用する気はありません
-valya

@valya実行中のプロセスをプログラムグループから切断することへの参照を見てきました。しかし、そうするためのツールは知りません。ツールは、std IOチャンネルもリダイレクトする必要があるでしょう。一度動作するようになったかもしれませんが、nohupの方が簡単だと判断しました。
-BillThor

1

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

nohup -p PID

nohup: invalid option -- 'p'。どのnohupシステムでどのバージョンを実行していますか?
アントン

私は主にSolarisとAIXを使用しています。Linuxの場合、disownコマンドをチェックインする必要があります。
トニー

ええ、-pLinuxにはオプションがないので、この答えはSolarisとAIX固有のものです。知っておくべきこと
セルギーコロディアズニー

1

このスクリプトは、子プロセスを親から切り離し、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.