ターミナルからGUIアプリをきれいに起動する方法は?


78

一部のGUIアプリは、ターミナルコマンドラインを介して正常に起動しますが、起動しないものもあり、アプリが終了するまでターミナルを待機させます。それでも、コマンドラインを「リリース」しない人もいます。

神秘的なアンパサンドの&サフィックスは、端末がプロセスをバックグラウンドにする原因になっているようです(しかし、そこで何が起こるかわかりません)。

ターミナルからアプリを起動する方法はありますか?Alt+で何かを起動するような「ハングオン」効果がありませんF2か?

バックグラウンドにまだ何かがなく、ターミナルで印刷せずに、すぐにコマンドラインを再び利用できるようにしたいと思います。


htorqueの要請で、私はあなたが受け入れた彼の答えを削除しました。別の答えを選んでもらえますか(最初にhtorqueの選択を解除する必要があります
オリ

1
Program-already-running(con-f-useで概説)に対処する方法はその状況に適していますが、私の主な質問は端末の乱雑なしのクリーンな起動でしたので、受け入れましたscreen(Oliによる言及)およびRobinJ)。その機能に感銘を受けました。それについて読んで、それを試した後...それは唯一のタイピングが必要ですscreen -d -m gedit(またはscreen geditそれからCtrl+a d取り外すために)...と私はまだ経由でいつでも(メッセージなどを警告するため)のgeditの端末ビューへのフルアクセス権を持っているscreen -r場合でも、Iその間に元の端末ウィンドウを閉じました
...-Peter.O

ところで、端末に帰属することのいくつかは、実際にはシェルによって行われ&ます。たとえば、コマンドの接尾辞の解釈などです。これは、説明に役立つ場合があります。ターミナル、コンソール、シェル、およびコマンドラインの違いは何ですか?
-wjandrea

回答:


17

geditの場合、私は常にコピーを開いたままにします。既存のコピーを実行している限りgedit、ターミナルから呼び出しを起動してからターミナルを閉じても、geditは終了しません。

他のことについては、他の人が言ったことも機能します。私はnohup… が好きです。しかし、もしあなたが端末を必要とするならば、あなたは切り離すことができます、そして次に再び接続します、あなたは見たいですscreen

  1. ターミナルで実行してから、出力をプッシュし続ける何かを実行します。私はDjango開発サーバーを使用していますがirssiwatch uptime良い例です。
  2. ターミナルを強制終了して、新しいターミナルを起動します。
  3. 実行しscreen -r、ブーム、あなたが戻っています。

screenそれはそれよりもずっと大きくbyobu、より良い端末体験のためにそれを組み合わせることができます。読んでください。


これは、画面が何をする/何をすることができるかについての最初の本当の洞察です...端末のヒントに感謝します
...-Peter.O

screenは使用できなくなりましたが、tmuxはscreenを置き換えることができます。(deatachするDを押して、新しいtmuxはセッションは、Ctrl + Bを起動すると、再接続するために添付tmuxはtmuxは)
Gmanスミス

84

仮定geditあなたが切り離さ実行したいプログラムがある(別名。「否認」、「ほぐし」、「デカップリング」)。正確に何をしたいかによって、さまざまな方法があります。

すでに実行中のプログラム

否認:

disown -hすでに実行中のプログラムでそれをしたい場合(つまり、忘れたnohup場合)に行く方法です。最初にCtrl+ を使用して停止する必要がありZます。次に、bg [jobId](などbg 1)を使用してバックグラウンドで配置できます。を使用して、jobIdで実行中のジョブのリストを取得しjobsます。その後、を使用してターミナルから分離できますdisown -h %[jobId]。端末セッションの例:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

プログラムはまだ開始されていません

いや

nohupすべてのマシンに常に存在するとは限りません。事前に分離したいことがわかっている場合は、次を使用します。

nohup gedit &

たぶん、シェル出力もリダイレクトし、プログラムを疑似入力ソースにしたいかもしれませんnohup ./myprogram > foo.out 2> bar.err < /dev/null &。出力に迷惑をかけないように、または後で使用するために、出力をリダイレクトしたいでしょう。ヌル入力は、sshなどでの接続解除を防ぐのに役立ちます。

サブシェル:

同様の効果を達成することができます

$ (geany >/dev/null 2>&1 &)

ブラケットは、geditを実行するための新しいサブシェルを開きます。>/dev/null 2>&1シェル出力をどこにもリダイレクトしません(出力を抑制します)。そして&最後に、プロセスをバックグラウンドに置きます。

端末多重化

screenまたはbyobuを使用した端末多重化。基本的には、独自のターミナルでプログラムを実行します。他の理由でも、for延を本当にお勧めできます。以下は、最初のステップに役立つ可能性のあるboybu-shortcutsのリストです。

有用:

  • F2 新しいウィンドウを作成する
  • F3 次のウィンドウに移動する
  • F4 前のウィンドウに移動する
  • F6 セッションから切り離してログアウトする
  • Shift-F6 セッションから切断しますが、ログアウトしません
  • F7 スクロールバック/検索モードに入る
  • Ctrl-F5 SSH / GPGソケットまたはエージェントを再接続します

あまり役に立たない:

  • Shift-F2 画面を水平に分割します
  • Ctrl-F2 画面を縦に分割する
  • Shift-F3 次の分割にフォーカスを移動
  • Shift-F4 前の分割にフォーカスを移動
  • Shift-F5 すべての分割を折りたたむ
  • F5 すべてのステータス通知を更新する
  • F8 現在のウィンドウの名前を変更する
  • F9 By風構成メニューを起動する
  • F12 GNU Screenのエスケープキー
  • Alt-Pageup このウィンドウの履歴をスクロールバックします
  • Alt-Pagedown このウィンドウの履歴を前方にスクロールします
  • Ctrl-a-! o風のすべてのキーバインドをオンまたはオフに切り替えます

「at」デーモンなど

atスケジュールされた時間にコマンドを実行するのに便利な便利なツールです。シェルからコマンドを切り離すために「誤用」される可能性があります。

echo './myprogram myoption1 myoption2' | at now

また、あなたはに見ることができるsetsidstart-stop-daemon、他の方法で十分です。


ヒント:ジョブが1つだけの場合、ジョブIDはオプションです。たとえば、代わりにbg %1を入力できますbg
MasterMastic

25

不思議なアンパサンド「&」サフィックスは、端末がプロセスをバックグラウンドにする原因になっているようです...(しかし、そこで何が起こるかわかりません)。

それは、多くの場合あなたが望むものです。&の使用を忘れた場合は、ctrl-zを使用してプログラムを中断し、bgコマンドを使用してバックグラウンドに配置し、そのシェルを引き続き使用できます。

プロセスのstdin、stdout、およびstderrはまだターミナルに接続されています。必要に応じて、それらを/ dev / nullまたは他のファイルにリダイレクトできます(たとえば、出力ログをどこかに保存します)。

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

ジョブでプロセスを確認し、フォアグラウンドに戻し(fgコマンド)、シグナルを送信(killコマンド)できます。

一部のグラフィカルプログラムは端末から切り離されます。その場合、「通常」コマンドを実行する、グラフィカルプログラムが起動して「終了」することに気付くでしょう。


ここに短いスクリプトがあります。これを〜/ binに配置して、runbgと名付けました。

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

リダイレクトする前にプログラム($ prog)を検索して、その場所を特定する際のエラーを報告できるようにします。「runbg your-command args ...」として実行します。出力をどこかに保存する必要がある場合でも、stdout / errをファイルにリダイレクトできます。

リダイレクトとエラー処理を除き、これはhtorqueのanswerと同等です。


さて、ありがとう... ctrl-z(サスペンド)コマンドラインに再びアクセスできるように見えますが、bgサスペンドを解除するように発行するまでGUIを空白にします。(理にかなっています)... GUIを切り離すことができる別のコマンドがあります...ああ!私はあなたが何を意味今見sighals (kill command)..私は作るためにコードスニペットを使用...(面白いこと、これらの信号を)dd...それは統計徐々に出力をし、それが使わkill信号+ ...「仕事を切り離すために特定の信号があります「?
Peter.O

リックの答えに対するあなたのコメントに気付きました...私はdisown jobs -p gedit`` を試してみ ましたが、それは仕事を削除するように見えました...(しかし、geditを手動で閉じたときにターミナルにシステムメッセージが表示されました...現時点では、ねじ込み式のターミナルがあります... 実験が多すぎます:(
Peter.O

@fred:ジョブはシェルによって管理されるため、シグナルで制御できません。いくつかのシェルを起動するのが最適であることがわかるかもしれません—いくつかのGUI端末はタブを許可し、screenまたはtmuxを使用できます。

2
@fred:jobs -p command1つのコマンドの複数のインスタンスが一度にバックグラウンドで実行されている場合は実行しないでください。を使用jobsして適切なジョブIDを見つけてjobs -p <job-id>から、ジョブのPIDを取得することができます。個人的には、サブシェルを使用したバージョンの方がはるかに簡単です。;-)
htorque

2
@htorque、フレッド:あなたはbashが最後のジョブを否認持つパラメータを指定せずに勘当を実行することができます:gedit & disown

22

アプリケーションを起動し、起動したターミナルからデタッチするには、&!を使用します。

firefox &!

6
知っておくと便利ですが、それはzshのみのようです。bashではdisown <pid-of-command>、コマンドをバックグラウンドで開始した後に手動で実行する必要があります。
htorque

興味深い...私はzshを調べますが、Linux初心者として、今のところbashに固執します...ありがとう
-Peter.O

感嘆符は何をしますか?
ナッツについてのナッツ

1
!終了から起動されたアプリケーションなしで端末を閉じることができるように、端末プロセスからアプリケーションプロセスを中断します。それはzshのもののようですが、便利です。
リック

しかし、これもbashで機能しました。
ジャッサー

20

つかいます nohup

nohupは、ハングアップ信号を無視して特定のコマンドを実行するプログラムです。そのため、親プロセスの終了後もコマンドはバックグラウンドで実行を継続できます。マンページを参照してください

例えば:

nohup gedit something

2
なにnohup?詳しく説明してください。
オックスウィビ

3
nohupは、ハングアップ信号を無視して特定のコマンドを実行するプログラムです。そのため、親プロセスの終了後もコマンドはバックグラウンドで実行を継続できます。参照マニュアルページ
フロリアンDiesch

実際、ここで私の答えは間違っていると思います。さらに考えて、nohupこのシナリオで使用する必要があります。
boehj

2
対話型シェルがSIGHUPシグナルを受信すると、そのすべての子にSIGHUPシグナルを送信できます(設定によっては送信しない場合があります)。これは、端末が閉じられたときに発生する可能性があります(または発生しません)。そのようなシグナルを処理する準備ができていない子は、デフォルトのアクション、つまり終了を実行します。nohupアプリケーション(とdisown、bashの組み込み)は、信号がアプリケーションに到達することはできません。
-enzotib

2
注意が必要なことの1つnohupは、現在のディレクトリにという名前のファイルを作成することですnohup.out。詳細については、manページ参照してください。disownこの理由と、disown起動後に機能するという事実のために、私は好みますgedit
フリム

4

ターミナルを開き、screenと入力し、実行するコマンドを入力して、ターミナルを閉じます。プログラムは、GNU Screenセッションで実行し続ける必要があります


GNU Screenとは正確には何ですか?
オックスウィビ

アイデアが正しければ、それはコマンドラインの一種のウィンドウマネージャーです。コマンドラインインターフェイスセッションで複数のプログラムを一度に実行できます。
ロビンJ

びょうぶ?
オックスウィビ

そのようなもの、By風だけが使いやすいです。私がnpotを間違えた場合、ByobuはGNU Screenの簡単なインターフェイスにすぎません。
ロビンJ



0

多くの人が考えているように、nohupは考慮すべきものです。ただし、nohupは端末上で開いたままになり、刺激的な端末上でプログラムアクティビティを表示します。それを避けるために、その後端末を閉じることができます。私が使用している非常に簡単な回避策を見つけました。

nohup gedit & exit

以上です。geditを開き、geditの起動時にターミナルを閉じます。geditは現在ターミナルに関連付けられていないため、アクティブのままです。


0

これはスクリプト内でも機能します(エイリアスと同様に、 '&'トレーラーは通常、インタラクティブではないためスクリプトでは許可されません):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'

0

これは私のために働いた:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.