回答:
スクリプトを開始し、出力を端末に煩わせることなく実行し、後で起動してスクリプトとやり取りしたい場合は、端末マルチプレクサを調べてください。お使いのシステムに応じて、tmux
またはをお勧めしますscreen
。これらの使用方法に関する情報は、以下のリンクで見つけることができます。
tmux:
画面:
編集:tmuxプライマーのリンクを追加
nohupはコマンドを端末から切断せず、スクリプトを無視SIGHUP
さstdout/stderr
せ、ファイルnohup.out
にリダイレクトするため、ログアウト後もコマンドはバックグラウンドで実行し続けることができます。
nohup
実行するコマンドをバックグラウンドで自動的に配置しません。コマンドラインをで終了することにより、明示的に行う必要があります&
。
$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’
jobs
現在実行中のジョブとそのステータスを印刷できます。コマンドjobs
がそれを見つけられない場合、そのシェルの子プロセスではなくなります。
$ jobs
[1]+ Running nohup ./script.sh &
バックグラウンドジョブをfg
実行するには、バックグラウンドジョブをbashでフォアグラウンドに戻すことができますnohup
。しかし、それは出力リダイレクトをnohup.out
変更しません。それはまだファイルに行きます。
$ fg
nohup ./script.sh
シェル/ターミナルを閉じるかログオフすると、コマンドはそのシェルの子ではなくなります。init
プロセスに属します。検索pstree
すると、プロセス1によって所有されていることがわかります(init
)。前景は存在しないため、前景に戻すことはできません。
If the command jobs cannot find it, then it is no longer a child process of that shell.
これは間違っています。このシーケンスを試して、方法を確認してくださいsleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$
。このコマンドを実行した後sleep
でも、スポーンしたときに同じPIDが出力されたままの作業が表示されますが、jobs
何も出力されません。子プロセスが子であるのを停止できる唯一の方法は、親を失う(孤児がの子になるinit
)か、分岐+終了(ただし、PIDが変更されるため、元の子ではない)です。
次に、端末マルチプレクサを使用しますが、画面ではなくtmuxを使用します。画面は、すべての意図と目的のために、維持されていません。その構成は暗い芸術であり、おそらく最初にネクロノミコンの付録に記録されます。独自の設定を作成しようとすると、Cthuluを垣間見ることができます。真剣に。人々の.screenrcファイルを見てください。確かに、設定ファイルの画面の憎悪を仲介する方法があります。By風は、定命のユーザーと不浄なコードの間のベールとして見事な仕事をしています。賢明な色、メニューインターフェイス、そしておそらく最も重要なステータスバーが付属しています。
しかし、私が言ったように、代わりにtmuxをお勧めします。まだいくつかのマイナーな設定が必要ですが、十分に文書化されており、設定ファイルは意味不明です。また、色とステータスバーから始めます。screenrcとtmux.confファイルを比較します。
Linuxコマンドは&
、最後に「」を追加してバックグラウンドに送信できます。
すべてのバックグラウンドジョブを表示するには、発行できます jobs
jobs
[1] + suspended nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2] running nohup sh kafka-server-start.sh ../config/server.properties
[3] - running nohup sudo mongod --dbpath=/var/lib/mongodb
ここでは、3つのジョブをバックグラウンドで実行しています:zookeeper、kafka、mongoデーモン。[1]、[2]、および[3]は、これらのタスクのそれぞれのジョブ番号です。
あなたはこれらのタスクをフォアグラウンドに持ってくることができます fg %$taskNumber.