回答:
デフォルトでは、端末はプログラムをフォアグラウンドで実行するため、プログラムが終了するまでシェルに戻りません。これは、stdinからの読み取りおよび/またはstdoutへの書き込みを行うプログラムに役立ちます。通常、それらの多くを一度に実行することは望ましくありません。プログラムをバックグラウンドで実行する場合は、次のように起動できます。
$ lxpanel &
または、既に実行されている場合は、Ctrl+で一時停止してZから実行bg
して、バックグラウンドに移動できます。いずれにしても、新しいシェルプロンプトが表示されますが、プログラムはまだ実行中であり、その出力はターミナルに表示されます(したがって、入力中に突然表示されることがあります)
一部のプログラム(通常はデーモン)は、起動時に別のプロセスをフォークし、メインプロセスをすぐに終了させます。これにより、シェルをブロックせずにプログラムを実行し続けることができます
端末でプログラムを起動すると、端末はプログラムが停止するまで「ハング」します。Ctrl+ cを押すと、プログラムを閉じているため、プロンプトに戻ります。すべてのGUIアプリでこれが表示されます。たとえば、Firefoxを試してください。
Alt + F2などの他の方法を使用するか、メニューをクリックすると、プログラムがバックグラウンドで起動するため、奇妙なことは何も起こりません(コマンドプロンプトも表示されません)。
それでもターミナルからGUIアプリを起動する場合&
は、コマンドの最後に次のように追加します。
lxpanel &
これにより、端末lxpanel
はバックグラウンドで実行され、すぐに別のプロンプトが表示されます。
デフォルトでは、シェルを介して実行されるプログラムは、そのシェルのフォアグラウンドで実行されます。これにより、シェルは操作を中断し、stdin / stdout / sterrを端末からプログラムに送信します。デスクトップ環境を介して実行されるプログラムはフォークされ、実行されたプログラムとは無関係に実行されます。これは&
、コマンドにa を追加することでほとんどのシェルでシミュレートできますが、これはまだstd *を端末に接続します(ただし、バックグラウンドプログラムでのstdinからの読み取りはさらに複雑になります)。
&バックグラウンドは、後でコンソールとの対話を必要とするプログラムを除いて十分です(たとえば、「apt -y update&」は、ユーザーに「本当に本当に強制する?」 ....誰も見ていないとき)。
その穴を塞いで、端末が実際に利用できなくなることをプロセスに通知するには、コマンドの一部に<&-を追加し、アクティブな端末から完全に切り離して、STDINが不可能であることを伝えます。 ただし、使用する場合は、/ bin / bashがシェルであることを確認してください。 スクリプトは、プロンプトをキャストするために使用可能な擬似端末がないことに関連するエラーのログ記録を続けます。
例えば:
`./runme.sh &> runme.log <&- & disown`
現在のターミナルセッションからの関連付けを解除する私の究極の方法です。STDOUTとSTDERRの両方がrunme.logに記録されます。コンソールまたはシェルがより早く終了するか、別のアカウント(runmeからのターミナルガベージなし)にログアウト/ suしても問題はありません。 PID関係が削除されます。
更新:それでも、セマフォが元の親の名前に関連付けられているので問題がありましたので、今では代わりに推奨します:
at now <<< "(cmd1; cmd2; etc.) &> logfile.log"
もちろん、CRONから出力を電子メールで送信する場合は&>を削除するか、ファイルではなく/ dev / nullにすべてリダイレクトします。
at now <<< "(cmd1; cmd2; etc.) &> logfile.log"
screen
)は、とりわけ、実行時間の長いプロセスを「ラップ」するために使用できます。そこから切り離してシェルに戻り、再接続して実行中のプロセスからの出力を確認できます。再接続は、別の端末、SSHなどから行うこともできます。この種のことを可能にする他のプログラムもあります。