ターミナルからバックグラウンドでプログラムを実行する


136

シェルのバックグラウンドでプログラムを実行し、プログラムを実行したままシェルを閉じるにはどうすればよいですか?UIに問題があるか、何らかの理由で、ターミナルウィンドウからプログラムを起動する必要があるとしますnm-applet

nm-applet

開始されると、ターミナルウィンドウの前景を占有します。

ターミナルを開いたままにしたり、ターミナル全体を占有したりすることなく、プログラムをバックグラウンドで実行する簡単な方法はありますか?

そのメモでは、アンパサンド(&)をコマンドに追加することで、ターミナルからプログラムを実行し、他の入力を許可する方法を見つけました。

nm-applet &

しかし、端末が閉じられると、端末で開始されたプロセスは強制終了されるため、これはあまり役に立ちません。                                                                        


7
nohup 'コマンド'&これは動作するようです。これに問題はありますか?
OVERTONE

回答:


173

最近好きになりましたsetsid。ターミナルから何かを実行しているように見えますが、切断して(ターミナルを閉じて)そのまま続行できます。

これは、コマンドが実際に分岐し、入力が現在の端末に到達する間、完全に別の親(端末を閉じた後も存続する)によって所有されているためです。

例:

setsid gnome-calculator

またdisown、プロセスを現在のツリーから分離するために使用できる部分的でもあります。バックグラウンドアンパサンドと組み合わせて使用​​します。

gnome-calculator & disown

また、かっこ付きのサブシェルの生成についても学びました。この簡単な方法は機能します。

(gnome-calculator &)

そしてもちろんnohup、あなたが言った通りです。質問nohup~/nohup.outせずに書く傾向があるので、私は気にしません。あなたがそれに頼るなら、それはあなたのためかもしれません。

nohup gnome-calculator

また、長期のプロセスには、screen接続間でセッションを維持する仮想端末マルチプレクサなどがあります。あなただけの端子出力に一時的にアクセスをしたいので、これらはおそらく、本当にあなたには適用されませんが、あなたがしたい場合は戻っていくつかの時間後に、最新の端末アクティビティを表示、画面はおそらくあなたの最良の選択でしょう。

インターネットにはscreenチュートリアルがたくさんありますが、簡単なクイックスタートを次に示します。


Oli、DISPLAY =:0 unityの場合-上記のどれを使用しますか?
ナッツについてのナッツ

4
@nuttyaboutnattyは、独自のシェルセッションで全体をラップしますsh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown。これは、すべてが適切に分岐することを確認するためのほとんどすべてのソリューションです。
オリ

1
@nuttyaboutnattyそれは私が言っていることですが--replace、実際には古いインスタンスを終了するため、2つのインスタンスが実行されることはありません。xsession内から2回目に実行すると、TTYnにバインドされたコピーが終了し、必要に応じて将来使用できます。おそらくもっと良い方法がありますが、必要になるたびに頭に浮かぶものがあります。
オリ

1
完璧で、私のために働いたのはサブシェル「(gnome-calculator&)」でした。私はそれを使用して、モノラルコンソールアプリをバックグラウンドで起動します。他の手法では、モノラルアプリは即座にクラッシュします。
ニコラオスゲオルギオ

2
将来のユーザーへの注意:の作成はnohup.outしstdoutとsterrの両方をリダイレクトするに抑えることができる/dev/nullので、好き:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy

55

ここに私が行く2つの方法があります。まず、端末から実行しないでください。ヒットAlt+ F2実行]ダイアログボックスを開き、そこから(なし&)それを実行します。

ターミナルから、実行します

nm-applet &

ただし、自分で端末を閉じないでください。つまり、閉じるためにXボタンを押したり、メニューバーから[ファイル]-> [終了]を使用したりしないでください。ターミナルをそのように閉じると、内部で実行されているbashにHUP(ハングアップ)シグナルが送信され、その子がすべての子にHUPシグナルを送信します(この場合nohupは機能します)。

代わりに、実行するexitCtrl+を押してシェルを終了しますD。bashはその子を無視し、終了して、バックグラウンドプロセスを実行したままにします。また、bashが終了すると、端末はその子プロセスを失ったため、端末も閉じます。

一度にすべてを行う:

nm-applet & exit

すごい!それを決して知らなかったし、これに言及する唯一の人であるようである。間違いなく、デスクトップ環境での私のお気に入りのアプローチです。残念ですが、これ以上は
投票

別のアプリケーションでこれを試してみましたが、失敗しmatlab & exitました。2つの個別のコマンドとして実行するとうまくmatlab & exit
いきました。– MattKelly

OPがターミナルを閉じるとバックグラウンドプログラムがクラッシュすると言ったのはなぜかと思っていました。ウィンドウの「x」ボタンで端末を閉じようとしたことはありません。
user1717828

xボタンはkillで、きれいに終了しませんが、exitコマンドは終了します。あなたは...代わりにexitコマンドにXボタンをリマップでき
ティム・ベイカー

14

あなたが指摘したように、あなたは実行することができます

nohup nm-applet &  

端末を閉じるときに終了信号を無視します。問題ありません。


他の選択肢はありますか?ただ、knowingsのためにではなく、何かのために
倍音

ウィキペディア(en.wikipedia.org/wiki/Nohup)には、使用echo command | at nowできない提案があります。
デスグア

2
アイコンまたはプログラムをダブルクリックすると、UIからどのように機能するのだろうか。
-OVERTONE

execnohup <command> &バックグラウンドでプロセスを実行し、現在のシェルプロンプトを返すための代替手段を提供します。
JSStuball

12

他の多くの答えが欠けていることの1つは、現在シェルをブロックしている実行中のプロセスを切り離す方法です。ほとんどの端末とシェルでは、Ctrl+ Zは実行中のプロセスを停止し、入力プロンプトに戻ります。次に、発行できます

bg

実行中のプロセスをバックグラウンドに送信します。問題

fg

代わりに、実行中のプロセスをフォアグラウンドに戻します。

編集:後で発見したこの回答の詳細。


7

(exec PROGRAM &> /dev/null & )サブシェルのPIDをに引き継ぐために使用しますPROGRAM。私はこのアプローチを複数の異なるプログラムで何度もテストしました。元の端末を閉じても、新しく生成されたプログラムには影響しません。

小さなデモ:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

うーん(exec firefox)、私は、Firefoxを終了...と端末SIGHUPsにシェルとサブシェルを閉じるまで、ターミナルをハング
KOS

回答を編集しました。他のいくつかのプログラムでテストしました。このバージョンでは、Firefoxまたは他のプログラムが制御端末をハングさせることはありませんでした
Sergiy Kolodyazhnyy

私にとってはうまくいく
ザンナ

bashのexecを使用する必要はないと思います。何らかの理由でPIDが必要になる可能性があります。
マリナラ

2

by風ターミナルをお勧めできます。F6キーを押すと、プロセスを簡単にデタッチできます。


1

上記には良い答えがありますが、バックグラウンドでのMATLABの使用方法について2セントをお伝えしたいと思います。

sudo -b matlab

-bsudo のタグは、バックグラウンドでアプリケーションを実行できます。このコマンドを実行した後、ターミナルを閉じることもできます。

おそらく、無関係ですが、シェルコマンドの説明に使用できるすばらしいWebサイトがあります。 http://explainshell.com/explain/8/sudo


0

私はその正しい方法を知りませんが、前のセッションを残したまま別のセッションを開始します。たとえば、ラズベリーで簡単なWebサーバーを実行しました。web.pyのもの。次に、新しいセッションを開始しますが、それはそのままにします。それでおしまい。また、他のセッションで作業している場合でも更新されるため、便利です。


2
Ask Ubuntuへようこそ!この回答を編集して、これを行う方法に関する具体的な詳細を追加することをお勧めします。(Ask Ubuntuでどのような回答が最も価値があると考えられるについての一般的なアドバイスについては、「良い回答を書くにはどうすればよいですか?」も参照してください。)
David Foerster

0

KDEを使用する場合は、を使用kstartして、ターミナルから切り離されたプログラムを起動することもできます。また、KDE環境がコマンドに対して正しくセットアップされていることを確認します。(kstart.cppソースコードを参照してください。そこからわかるように、を使用しKProcess::startDetachedKProcessから派生しQProcess、から派生し、startDetached新しいプロセスを開始し、そこから切り離します。)

同様のもkde-openまたはxdg-openまたはgnome-openです。


このように、回答よりもコメントのように見えます。展開するには編集してください。ワンライナーを与えるだけではありません。あなたが正しい理由を、理想的には引用で説明してください。説明のない回答は削除の対象となります。
anonymous2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.