コマンドラインからGUI Linuxプログラムを起動する方法はありますか?


88

以前にこれを検索しましたが、答えを見つけることができませんでした。

Windowsでは、コンソールウィンドウが開いている場合winmine、を入力してEnterキーを押すと、Minesweeperが表示され、cmdプログラムから完全に分離されます。マインスイーパの親は、コマンドプロンプトのインスタンスに設定されていることを除き、マインスイーパのインスタンスは、私が知っている方法でコマンドプロンプトに関連付けられていません。ただし、Linuxでは異なります。

Linuxでは、コンソールウィンドウを開いてemacs入力し、Enterキーを押すと、Emacsが開きますが、コマンドラインに関連付けられているようです。具体的には、Emacsのインスタンスが閉じられるまで、コマンドラインを使用できないようです。LinuxでWindowsの動作を再現する方法はありますか?

ありがとう!



ギーコサウルスに答えてください。
ジョシュアロビソン

Windows7のでは、それはここでC minesweeper.exeています:そのディレクトリがパスにないよう..の\ Program Files \ Microsoftゲーム\掃海艇がそうminesweeper.exeは、一般的に動作しませんがそしてとにかく、あなたがWindowsのバージョンを必ず明記してください
barlop

回答:


10

ではbashdetach内蔵されて、次のように使用:

emacs &
detach %+ # or % + the number in brackets printed after the above

ではzsh、1回の操作でバックグラウンドとデタッチを実行できます。

emacs &|

108

追加&コマンドラインに:

emacs &

これにより、emacsがバックグラウンドに配置され、端末の使用を継続できます。

これはemacsをターミナルのサブプロセスとして残すことに注意してください。ターミナルを終了すると、emacsも終了します。これを回避するには、次を入力します。

(emacs &)

括弧は、emacsプロセスを端末から切り離すよう端末に指示します。

それでも、プログラムからのstdoutおよびstderrメッセージは端末に表示されます。これを防ぐには、次を使用します。

(emacs &> /dev/null &)

9
私は特に(emacs&)ヒントが好きです。

1
既にタスク(emanc)を開始している場合は、CTRL-Zを使用してスリープ状態にし、コマンド「bg」を使用してバックグラウンドに送信します。
ジェイアン

@StackTrace:そうすると、ターミナルを閉じると、emacsも強制終了されます。
ネイサンフェルマン

1
OK ..以前は「nohup」を使用してこれをデタッチしました。プロセスが開始されると実行できません
...-Jayan

このコマンドが発行されたターミナルウィンドウでCtrl+ Cを押すと、プロセスが強制終了されます。<
リチャード

21

を使用しnohupます。このような:nohup amarok &

お役に立てれば。


19

さまざまなソースからの回答を含む類似のトピックの古いスレッドへの回答を投稿しまし。以下は、このスレッドに適合した回答のコピーです。


以下の作品:

$ (gui_app &> /dev/null &)

これは、ネイサンフェルマンの答えとリダイレクトです。

「&> / dev / null」は、stdoutとstderrの両方をnullデバイスにリダイレクトします。最後のアンパサンドは、プロセスをバックグラウンドで実行します。コマンドを括弧で囲むと、「gui_app」がサブシェルで実行されます。

これを行うと、このコマンドを実行するコンソールから「gui_app」プロセスが切り離されます。そのため、親端末エミュレータが実行されているウィンドウを閉じても、「gui_app」は閉じません。私はこれを実行し、「pstree」コマンドでプロセスツリーを見て、この方法で開始されたアプリケーションが「init」の子プロセスになることを発見しました。

例えば、

$ gui_app &> /dev/null &

バックグラウンドでアプリケーションを実行しますが、コンソールプロセスの子プロセスになり、ターミナルを閉じると終了します。(exitコマンドまたはCtrl-Dを使用してbashを介して端末を終了しても、バックグラウンドプロセスをinitに渡すことでbashをクリーンアップできます。)

「nohup」はNawaManが示唆したように機能しますが、デフォルトでは出力とエラーをファイルにリダイレクトします。JeffGが回答したように、「disown」コマンド(シェルで使用可能な場合)は、バックグラウンドプロセスを開始した後、ターミナルからプロセスを切り離すことができます。

$ gui_app &
$ disown

(ところで、これはすべてbashに当てはまります。他のシェルには、これを行うための他のメソッド/構文があるはずです。)

参照: プロセスの否認(UNIX Power Tools)

複雑なオプションなどのないGUIアプリケーションの単純な呼び出しである場合、「gmrun」またはdmenu(警告:大音量の音声)などのランチャーを使用することも適切なオプションです。キーの組み合わせにバインドします。ランチャーはまだ使用していませんが、これら2つを試しました。

注:他のスレッドのコメントの CarlFは、「gui_app&」メソッドを介して開始されたGUIアプリが親端末を終了しても閉じないことを報告しています。さまざまな方法で端末を閉じていたと思います。ターミナルエミュレータが実行されていたウィンドウを閉じていました。シェル(終了コマンドまたはCtrl-D)を介してターミナルエミュレータを終了していた可能性があります。これをテストしたところ、CarlFが言うように、bashを終了しても、ターミナルのバックグラウンドプロセスとして起動されたGUIが停止しないことがわかりました。bashは、クリーンアップの機会が与えられると、バックグラウンドプロセスを初期化して引き渡すようです。実際、これはサブシェルで開始されたバックグラウンドプロセスがinitに渡されるメカニズムでなければなりません。


11

util-linuxには、基本的にdetachが行うことを行うsetsidと呼ばれるツールが含まれています。

$ setsid someprogram

これはsomeprogram新しいセッションで実行されます。


9

入力xemacs &して、バックグラウンドでXEmacsを開いてみてください。

これを「Windowsの動作のエミュレート」と呼ばないでください。痛い。

次のこともできます。

  • 新しいターミナルを開く
  • 端末を使用する代わりに、Alt + F2またはウィンドウマネージャーを使用してプログラムを起動します。
  • GNUスクリーンを使用する

7

「サイレントバックグラウンド」の「sbg」という名前の実行可能スクリプトファイルに次のコードを配置します。シェルから起動されているプログラムを完全に切断するために必要なすべてのことを行います/dev/null。stdin、stdout、およびstderrをリダイレクトし、ハングアップを無視し、バックグラウンドで実行し、デタッチします。

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

その後、あなたはちょうどすることができますsbg emacs。必要な引数を渡すこともできますsbg emacs --daemon FILE1 FILE2


スクリプティングソリューションは私にとって最適に機能しました。ありがとう!! 私が使用しましたが(gui_app &> /dev/null &)(EMPraptorの答え@)の代わりに
ジミおけ


3

bashを使用している場合、プロセスを否認できます。

% firefox &
% disown 


1

他の答えが言うように、次を使用できます。

$ emacs &

&ただし、忘れた場合は、を押してCtrl-zから使用しますbg

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

参考:Ctrl-zemacsプロセスを停止bgし、バックグラウンドに送信します。


0

ちょうど使用して&のように$ x &私はと呼ばれる小さなプログラム拾った端末にアタッチされたプロセスの葉detach http://inglorion.net/software/detach/私のようにエイリアスしているd、それは少しのようなものですnohupが、ログ・ファイルのI残していませんがそれを使用してmupdfをデタッチしますd mupdf x.pdf


0

これをあなたに~/.bashrc

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

どのプログラムがX11であるかを覚えておく必要はありません。また、それらは自動的に切り離されるため、特別な操作を行う必要があります。最後のものは必要ではないHUPシグナルをブロックするため、setsidより良いことに注意してくださいnohup

PSこれwinmineで、Linuxの準備が整いました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.