Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxプロセスをバックグラウンドで安定に動作させる方法

Linuxプロセスをバックグラウンドで安定に動作させる方法

  

リモートのLinuxサーバーにtelnet /sshでログインして、時間のかかる作業を実行することがよくありますが、その結果はネットワークの不安定性、システムのタイムアウト、またはユーザーによるものですログアウトすると、タスクは途中で失敗します。では、どうすればローカルのクローズドターミナルウィンドウやネットワークの切断に邪魔されることなくコマンドを送信できますか。シナリオごとに、この問題を解決するためのさまざまな方法を選択できます。

1.サービスシナリオ1:

ユーザーがログアウトするかネットワークが切断されると、端末はHUP(ハングアップ)シグナルを受信して​​そのすべてのサブプロセスを閉じることがわかっています。したがって、私たちの解決策には2つの方法があります:プロセスにHUPシグナルを無視させるか、またはプロセスを新しいセッションで実行させてこの端末に属さない子プロセスにすることです。

1. nohup

nohupは間違いなく私たちが考える最初のものです。名前が示すように、nohupの目的は送信されたコマンドにハングアップシグナルを無視させることです。処理したいコマンドにnohupを追加するだけで、標準出力と標準エラーがデフォルトでnohup.outファイルにリダイレクトされます。通常、'&'を追加してコマンドを最後にバックグラウンドにするか、'> filename 2> 1″を使用してデフォルトのリダイレクトファイル名を変更します。

表示1:

[root @ test〜]#nohup ping www.chinaunix.net&

[1] 3059

nohup:出力を `nohup.outに追加します。

[root @ test〜]#ps -ef | Grep ping

root 3059 984 0 21:06 pts /3 00:00:00 ping www.chinaunix.net

root 3067 984 0 21:06 pts /3 00:00:00 Grep 3059

2番目に、ビジネスシナリオ2:1.setsid

nohup HUPシグナルを無視することで、間違いなく私たちのプロセスを回避することができます。このプロセスは、HUPシグナルを受け入れる端末のサブプロセスではないため、当然HUPシグナルの影響を受けません。この問題を解決するには、別のコマンドsetsidが必要です。例2:


[root @ test〜]#setsid ping www.chinaunix.net

[root @ test〜]#ps -ef |例2 Grep www.chinaunix.net

root 31094 1 0 07:28?00:00:00 ping www.chinaunix.net

root 31102 29217 0 07:29 pts /4 00:00 :00 grep www.chinaunix.net

[root @ test〜]#

上記の例では、プロセスID(PID)は31094で、その親IDは注目に値します。 (PPID)は1(つまり、initプロセスID)であり、現在の端末のプロセスIDではありません。

2.&

サブシェルについても少しトリックがあります。 '()に1つ以上の命名を含めると、これらのコマンドをサブシェルで実行できるようになり、さまざまな興味深い機能が拡張されることがわかっています。そのうちの1つについて説明します。

'&'を'()'に含めると、送信されたジョブがジョブリストに含まれていない、つまりジョブを使用できないことがわかります。それを見てください。これがHUPシグナルの影響を免れる理由を見てみましょう。

例:

[root @ test〜]#(ping www.chinaunix.net&)#

[root @ test〜]#ps -ef |例 Grep www.chinaunix.net

root 16270 1 0 14:13 pts /4 00:00:00 ping www.chinaunix.net

root 16278 15362 0 14:13 pts /4 00 :00:00 grep www.chinaunix.net

[root @ test〜]#

上記の例からわかるように、新しく送信されたプロセスの親ID(PPID)は1です。 initプロセスのPIDは、現在の端末のプロセスIDではありません。したがって、それは現在の端末のサブプロセスに属さず、したがって現在の端末のHUP信号による影響を受けない。

3.ビジネスシナリオ3:

コマンドの前にnohupまたはsetsidを追加すれば、HUPシグナルの影響を回避できることは既にわかっています。しかし、何も処理せずに注文を送信済みの場合、HUPシグナルの影響を回避するためにどのようにしてそれを修正できますか?

回避策:

現時点では、nohupまたはsetsidを追加するには遅すぎますこの問題は、ジョブのスケジュール設定によってのみ解決できます。

CTRL-zの柔軟な使用

日常業務では、CTRL-zを使用して現在のプロセスをバックグラウンドで実行し、その他の操作を実行してから、次のコマンドを実行できます。中断されたプロセスをフォアグラウンドに戻すにはFg(中断されたプロセスをバックグラウンドにするためにbgを使用することもできます)を実行し続けます。これにより、1つの端末で複数のタスクを柔軟に切り替えることができます。これは、コードをデバッグするときに特に便利です。コードエディタはバックグラウンドでハングアップしてから元に戻されるため、カーソルの位置は最後にハングしたときのままになり、再配置の手間が省けます。 - disown -h special_jobを使用してジョブにHUPシグナルを無視させる、 - disown -ahを使用してすべてのジョブにHUPシグナルを無視させる、 - disown -rhを使用して実行中のジョブにHUPシグナルを無視させる

disownを使用すると、ターゲットジョブがジョブリストから削除されます。ジョブを使用して表示することはできなくなりますが、ps -efを使用して表示することはできます。

しかし、まだ問題があります。このメソッドの操作対象はジョブですコマンドの最後に&を追加してジョブにしてバックグラウンドで実行すると、すべて問題ありません。jobsコマンドを使用して、すべてのジョブのリストを取得できます。しかし、現在のコマンドをジョブとして実行していない場合、そのジョブ番号を取得するにはどうすればよいでしょうか。答えはCTRL-zを使うことです!

CTRL-zの目的は現在のプロセスを中断することです(中断)。それからjobsコマンドを使ってそのジョブ番号を問い合わせ、それからbg job_specを使ってそれをバックグラウンドにして実行を続けます。一時停止が現在のプロセスの実行結果に影響を与える場合は注意してこの方法を使用してください。

例1:(コマンド送信時に<&'コマンドを使用してコマンドをバックグラウンドにしている場合は、' disown'を使用できます)

[root @ test]# Cp -r file1 file2&

[1] 4825

[root @ test]#jobs

[1] + cp -i -r file1 file2& Cの実行

[root @ test]#disown -h%1

[root @ test]#ps -ef | Grep cp

root 4825 968 1 09:46 pts /4 00:00:00 cp -i -r file1 file2

root 4853 968 0 09:46 pts /4 00:00: 00 grep cp

[root @ test]#logout

例2:(コマンドを送信するときに'&"を使用しない場合は、CTRL-zを使用できます)そして、バックグラウンドでそれを置き、そして< disown& ')を使用します。

[root @ test]#cp -r file1 file2

[1] +停止したcp -i - r file1 file2

[root @ test]#bg%1

[1] + cp -i -r file1 file2&

[root @ test]#jobs < Br>

[1] + cpの実行-i -rファイル1ファイル2&

[root @ test]#disown -h%1

[root @ test]#ps -ef | Grep cp

root 5790 5577 1 10:04 pts /3 00:00:00 cp -i -r file1 file2

root 5824 5577 0 10:05 pts /3 00:00: 00 grep cp

[root @ test]#

Copyright © Windowsの知識 All Rights Reserved