リモートの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]#
今日、同社はまた、私は本当にサーバーを行う最初の時間は、それよりもはるかに少ないがあるかもしれない、シンプルなftpサーバを作りましたよ!私はあなたと共有するために、プロセスを書き留めます。ちょっと
1. LVSの概要 1.大規模同時アクセスのニーズを満たすために、アプリケーションサーバーに高可用性とロードバランシング機能を提供します。2.コスト削減。代替の商用ハードウェアロードバランサは、スタ
Unix系システムでは、topを使用してシステムリソース、プロセス、メモリ使用量などの情報を表示することができます。ネットワークの状態を表示するには、netstatやnmapなどのツールを使用できます
adbシェル端末で、電話の現在のすべてのプロセスステータスを表示するには、psと入力しますpsのフルネームはProcess Statusです。
1. psコマンドのパラメータ
Grep `; すべての一般的なアプリケーションを見るandroidはシングルユーザなので、通常のプロセスのユーザはu0 で始まり、googleはandroidをもっとサポートするようになること