一部のGUIアプリは、ターミナルコマンドラインから正常に起動しますが、起動しないものもあり、アプリが終了するのをターミナルに待機させます。それでも、コマンドラインを「リリース」しない人もいます。
謎のアンパサンド&
接尾辞は、端末がプロセスをバックグラウンドにする原因になっているようです(しかし、そこで何が起こるかわかりません)。
ターミナルからアプリを起動する方法はありますか? Alt+F2?
バックグラウンドで何かがまだ端末に出力されていない状態で、すぐにコマンドラインを再び利用できるようにしたいと思います。
Geditの場合、私は常にコピーを開いたままにします。既存のコピーを実行している限り、ターミナルからgedit
呼び出しを起動してからターミナルを閉じても、geditは終了しません。
他のことについては、他の人が言ったことも機能します。私はNohup
のファンです。しかし、端末を必要とする場合は、デタッチしてから再接続できます。screen
をご覧ください。
irssi
またはwatch uptime
が良い例です。screen -r
とBOOMを実行すると、元に戻ります。screen
はそれよりもはるかに大きいため、byobu
と組み合わせて端末の操作性を向上させることができます。読んでください。
gedit
を切り離した状態で実行するプログラム(たとえば、「disowned」、「disentangled」、「decoupled」)であるとします。正確に何をしたいかによって、さまざまな方法があります。
disown -h
は、既に実行中のプログラムでそれを行いたい場合(つまり、Nohup
itを忘れた場合)に行く方法です。最初に使用して停止する必要があります Ctrl+Z。その後、bg [jobId]
(たとえば、bg 1
)を使用してバックグラウンドに配置できます。 jobs
を使用して、実行中のジョブとそのjobIdのリストを取得します。その後、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 または byob を使用した端末多重化。基本的には、独自のターミナルでプログラムを実行します。他の理由でも、for延を本当にお勧めできます。以下は、最初のステップに役立つ可能性のあるボーイブショートカットのリストです。
有用:
あまり役に立たない:
at
は、スケジュールされた時間にコマンドを実行するための便利な便利なツールです。シェルからコマンドを切り離すと「誤用」される可能性があります。
echo './myprogram myoption1 myoption2' | at now
setsid
とstart-stop-daemon
を調べることもできますが、他の方法で十分です。
謎のアンパサンド「&」サフィックスは、端末がプロセスをバックグラウンドに移行させるように思われます...(しかし、そこで何が起こるかわかりません)。
それは、多くの場合あなたが望むものです。 &の使用を忘れた場合は、ctrl-zを使用してプログラムを中断し、bgコマンドを使用してバックグラウンドに配置し、そのシェルを引き続き使用できます。
プロセスのstdin、stdout、およびstderrは、まだ端末に接続されています。必要に応じて、/ dev/nullまたは他のファイルにリダイレクトできます(たとえば、出力ログをどこかに保存します)。
some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1
ジョブでプロセスを確認し、フォアグラウンドに戻し(fgコマンド)、シグナルを送信(killコマンド)できます。
一部のグラフィカルプログラムは端末から切り離されます。その場合、「通常」コマンドを実行すると、グラフィカルプログラムand「exits」が起動することがわかります。
ここに 短いスクリプト があります。これは 〜/ 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's answer と同等です。
アプリケーションを起動し、起動したターミナルからデタッチするには、&!を使用します。
firefox &!
Nohup
を使用します
Nohupは、ハングアップ信号を無視して特定のコマンドを実行するプログラムです。そのため、親プロセスの終了後もコマンドはバックグラウンドで実行し続けることができます。 manpage を参照してください
例えば:
Nohup gedit something
ターミナルを開き、screenと入力し、実行するコマンドを入力して、ターミナルを閉じます。プログラムはGNU Screenセッションで実行し続ける必要があります。
これは私のために働いた:
$ (Nohup gedit 2>/dev/null &)
この汎用ユーティリティをご覧ください: https://linux.die.net/man/1/xdg-open
これにより、ファイルマネージャーで相対位置が開きます。
$ xdg-open .
これにより、pdfリーダーでpdfファイルが開きます。
$ xdg-open foo.pdf
Web URLを提供することもできます
$ xdg-open www.google.com
多くの人が考えているように、Nohupは考慮すべきものです。しかし、Nohupは端末上で開いたままであり、刺激的な端末上でプログラムアクティビティを表示します。それを避けるために、その後は端末を閉じるだけです。私が使用する非常に簡単な回避策を見つけました。
Nohup gedit & exit
以上です。 geditを起動し、geditの起動時にターミナルを閉じます。 geditは現在ターミナルに関連付けられていないため、アクティブのままです。
これはスクリプト内でも機能します(エイリアスと同様に、 '&'トレーラーは通常、対話型ではないためスクリプトでは許可されません)。
bash -i >/dev/null 2>&1 <<<'Nohup gedit &'
これは私のために働いた:
$ (some-program &) &>/dev/null
# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null