Linuxでnohupコマンドを使用する方法
Linuxコマンドnohup
を使用すると、重要なプロセスを起動したターミナルウィンドウが閉じていても、重要なプロセスを実行し続けることができます。この由緒あるコマンドを最新のLinuxで使用する方法を紹介します。
HUPとSIGHUP
Linuxの祖先であるUnixは、PCが発明される前に作成されました。コンピューターは大きくて高価な機器でした。人々は、同じ建物内でローカルに、または低速のモデム接続を介してリモートで、シリアル回線を介してそれらと対話しました。当初、彼らはテレプリンターで指示を印刷しましたが、徐々に鈍い端末に置き換えられました。
処理能力は、入力している端末ではなく、接続しているコンピューターにあるため、ダムと呼ばれていました。プログラムは、机の上のデバイスではなく、どこにいてもコンピューター上で実行されました。
端末とコンピューターの間の接続を切断する何かが起こった場合、コンピューターは改行を検出し、HUP
実行中のプログラムに信号を送信または切断しました。プログラムは、信号を受信すると実行を停止しました。
この機能は、現在Linuxで使用されています。PCのターミナルウィンドウは、物理ターミナルのエミュレーションです。このターミナルウィンドウから起動されたプロセスを実行していて、このウィンドウを閉じるSIGHUP
と、プログラムにシグナルが送信され、プログラムに通知されHUP
、終了する必要があることがわかります。
カスケード効果があります。プロセスが子プロセスを開始した場合、SIGHUPもプロセスに渡されるため、プロセスは終了する必要があります。
コマンドnohup
は子プロセスを開始しますが、それらに信号を送ることを拒否しSIGHUP
ます。これは問題のように見えるかもしれませんが、実際には便利な機能です。
noupコマンド
起動元のターミナルウィンドウが閉じていてもプロセスを続行したい場合はSIGHUP
、プログラムがプロセスを取得しないように、プロセスをトラップする方法が必要です。(ターミナルウィンドウは実際にはプロセスを開始しません。ターミナルウィンドウ内のシェルセッションによって開始されます。)この問題の簡単で洗練された解決策は、シェルセッションとプログラムの間に別のプロセスを配置し、ミドルウェアプログラムを使用することです。信号を送ることはありませんSIGHUP
。
それがそれnohup
がすることです。nohup
シェルの子プロセスではなく、子プロセスになるためのプログラムを実行します。これらはシェルの子プロセスではないためSIGHUP
、シェルから直接受け取ることはありません。そして、nohup
彼がそれを彼の子供たちに渡さなければSIGHUP
、プログラムはそれをまったく受け取らないでしょうSIGHUP
。
これは、たとえば、完了する前に実行する必要がある長いプロセスがある場合に役立ちます。誤ってターミナルウィンドウとそのシェルを閉じた場合も、プロセスが終了します。プロセスを開始するために使用nohup
すると、プロセスがnohup
シグナルから分離されます。SSH経由でコンピューター上でリモートで作業していて、リモート接続が失敗した場合に重要なプロセスを終了させたくない場合は、拡張子が。のリモートコンピューターでプロセスを開始する必要がありますnohup
。
nohupを使用する
何の役にも立たないプログラムを作成しましたが、実行は終了するまで実行されます。ターミナルウィンドウに3秒ごとに時刻を表示します。これはlong-proc
「ロングプロセス」と呼ばれます。
./long-proc
それが何か便利なことをするプログラムであり、ターミナルウィンドウとシェルが閉じていても実行を継続したい場合は、を使用して実行しnohup
ます。
nohup. /long-proc
プロセスはプロセスから分離されているためstdin
、stdout
データを受信したり、ターミナルウィンドウに書き込んだりすることはできません。また、まだ実行中なので、コマンドプロンプトに戻ることはありません。実行するnohup
必要があるのは、プロセスをターミナルのクローズの影響を受けないようにすることだけです。プロセスをバックグラウンドタスクに変えることはありません。
プロセスを完了するために再起動する必要がありますか?いいえ。バックグラウンドプロセスとして開始していないプロセスを停止nohup
するには、Ctrl+Cのキーの組み合わせを押します。
プログラムの出力は、「nohup.out」というファイルに書き込まれています。低コストでご覧いただけます。
less nohup.out
通常、ターミナルウィンドウに送信されるものはすべて、ファイルにキャプチャされます。後続nohup
の実行は、既存の「nohup.out」ファイルに追加されます。
プロセスを開始するためのより便利な方法はnohup
、ターミナルウィンドウを閉じるのに耐えられるようにプロセスを開始すると同時に、バックグラウンドタスクにすることです。これを行うに&
は、コマンドラインの最後にアンパサンド””を追加します。
nohup. /long-proc &
コマンドラインに戻るには、もう一度「Enter」を押す必要があります。プロセスジョブ番号は1(括弧内の番号 ” []
“)であり、プロセスIDは13115であると通知されます。
それらのいずれかを使用してプロセスを完了することができます。プログラムがターミナルウィンドウにもシェルにも接続されていないため、「Ctrl+C」は機能しなくなりました。
ジョブ番号を忘れた場合はjobs
、コマンドを使用して、このターミナルウィンドウから実行されているバックグラウンドタスクを一覧表示できます。
jobs
タスクを強制終了するには、次のようにkill
、パーセント記号””が前に付いたコマンドとタスク番号を使用できます。%
kill %1
ターミナルウィンドウを閉じた場合は、プロセスIDを見つけてkill
、コマンドで使用する必要があります。このコマンドpgrep
は、入力した検索キーに一致するプロセスのプロセスIDを検索します。プロセス名を探します。
pgrep long-proc
これで、プロセスIDを使用してプロセスを終了できます。
kill 13115
次に「Enter」を押すと、プロセスが完了したことが通知されます。
次に、プロセスを終了しないものを見てみましょう。再起動して、ターミナルウィンドウを閉じます。
nohup. /long-proc
新しいターミナルウィンドウを開いて、でプロセスを見つけるとpgrep
、まだ実行中であることがわかります。プロセスを開始したターミナルウィンドウを閉じても効果はありませんでした。
pgrep long-proc
に複数のコマンドを渡すことができますがnohup
、通常は個別に実行するのが最適です。これにより、バックグラウンドジョブとしてそれらを操作しやすくなります。コマンドは同時に実行されるのではなく、次々に実行されます。実行は並列ではなく、順次です。それらが同時に機能するためには、それらを別々に実行する必要があります。
そうは言っても、同時に複数のプロセスを実行するにはnohup
、Bashシェルを使用して開始-c
し、コマンドラインで(コマンド)オプションを使用します。'
コマンドのリストを囲むには一重引用符””を使用&&
し、コマンドを区切るには二重アンパサンド””を使用します。
nohup bash -c 'ls /bin && ls /sbin'
「nohup.out」ファイルをless
表示すると、最初のプロセスの出力が表示され、次に2番目のプロセスの出力が表示されます。
less nohup.out
両方のコマンドの出力は、「nohup.out」ファイルにキャプチャされています。これは絡み合っていません。2番目のプロセスからの出力は、最初のプロセスが完了した後にのみ開始されます。
「nohup.out」の代わりに独自のファイルを使用する場合は、コマンドを選択したファイルにリダイレクトできます。
nohup bash -c 'ls /bin && ls /sbin' > myfile.txt
メッセージには「出力をnohupo.outに追加する」ではなく、「stderrをstdoutにリダイレクトする」と書かれておらず、stdoutを「myfile.txt」ファイルにリダイレクトしていることに注意してください。
少ない労力で「myfile.txt」ファイルの内部を調べることができます。
less myfile.txt
以前と同様に、両方のコマンドの出力が含まれています。
ユーティリティの歴史が、現在とは関係がないという印象を与えることがあるのはおかしいです。チームnohup
はその1つです。シリアル改行を処理するために作成されたものは、信じられないほど強力なマシンを使用している今日のLinuxユーザーにとっては依然として有用です。
コメントを残す