web-dev-qa-db-ja.com

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

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

nm-applet

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

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

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

nm-applet &

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

132
OVERTONE

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

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

例:

setsid gnome-calculator

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

gnome-calculator & disown

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

(gnome-calculator &)

そしてもちろん、あなたが言ったようにNohupがあります。 Nohupについては、私に尋ねずに~/Nohup.outに書き込む傾向があるので、私はワイルドではありません。あなたがそれに頼るなら、それはあなたのためかもしれません。

Nohup gnome-calculator

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

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

171
Oli

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

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

nm-applet &

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

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

一度にすべてを行う:

nm-applet & exit
53
geirha

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

Nohup nm-applet &  

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

14
desgua

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

bg

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

fg

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

編集この回答 で詳細を確認しました。後で発見しました。

11
krlmlr

(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
7

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

2
speter

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

Sudo -b matlab

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

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

1
user3342981

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

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

0
Albert

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

0
leo