CentOSはバックグラウンドプロセスをどのように実行し、制御しますか?
リモートのLinuxサーバにsshでログインし、時間のかかるタスクを実行したが、ネットワークなどの不安定さでタスクが途中で失敗したという問題によく遭遇します。
これは、ユーザがログアウト(logout)またはネットワークが切断されると、端末がHUP(hangup)信号を受信してすべてのサブプロセスを閉じるためである。
解決策は、プロセスにHUP信号を無視させるか、新しいセッションでプロセスを実行させてこの端末に属さないサブプロセスにするかの2つです。
Linuxでバックグラウンド・プロセスを実行および制御する方法について説明します。 1.nohup名前の通り、nohupの用途は、コミットされたコマンドにすべてのhangup信号を無視させることです。
使用方法:nohup COMMAND[ARG]…
2.setsid新しいセッションでコマンドを実行することで、現在の端末からのHUP信号を避けることができます。
使用方法:setsid COMMAND[ARG]...
3.&()と組み合わせて新しいサブシェルを生成し、現在のシェル端末のHUP信号の影響を受けないように、このサブシェルでタスクをバックグラウンドに配置して実行することができる。
使用方法:(COMMAND[ARG]……&)
私の一般的な使い方は次のとおりです。
nohup ./filename.sh > filename.log 2>&1 &
nohup ./filename.sh &> filename.log &
3つの理由:1)nohup保障プロセスはhangup信号によって異常に中断されない。
2)タスクをバックグラウンドに配置して実行し、現在の端末を占有しない。
3)エラー出力もlogに印刷し、デフォルト>標準出力のみ、エラー出力はありません。
4.プロセスの制御以下のコマンドにより、バックグラウンドに挿入されたコマンドを制御できます。
現在の端末のバックグラウンド・プロセスを表示するには、次の手順に従います。
直接実行:jobs
表示されたバックグラウンド・プロセスをフロントに戻します。
直接入力:fg{jobid}//ここの{jobid}はjobsコマンドで見られるプロセス前の[]の数字です。
現在フロントで実行中のプロセスをバックグラウンドで実行します。
ショートカットキーを押してください:ctrl+z//現在実行中のプロセスを一時停止します。
再実行:bg
現在フロントで実行中のプロセスを終了します。
ショートカットキーを直接叩く:ctrl+c
5.disown亡羊補牢は、nohupとsetsidを使用しないプロセスにHUP信号を無視する機能を加えた。
使用方法:
現在フロントで実行中のプロセスをバックグラウンドで実行します。
次にdisown-h%{jobid}//ここでの{jobid}はjobsコマンドで見られるプロセス前[]の数字です。
6.screenによる安定したバックグラウンド運転screenは、手動でexitを入力したときにのみ終了する新しいフルスクリーン仮想セッション端末を構築しています。このセッションで実行されるコマンドは、HUP信号が私たちのプロセスに影響を与える心配はありません。そのため、各コマンドに「nohup」や「setsid」を加える必要はありません。多くのバックグラウンドタスクを計画的に実行するのに適しています。これらのバックグラウンドタスクを管理するのに非常に便利です。
使用方法:screen//すぐにセッションを作成して入ります。
screen-dmS{name}//フラクチャモードのセッションを確立し、必要に応じてセッション名を指定します。
screen-list//すべてのセッションをリストします。
screen-r{name}//は、指定したセッションに独占的にアクセスします。
screen-x{name}//指定したセッションに並列にアクセスします。
ctrl+ad//ショートカットctrl+aとdを入力すると、現在のセッションを一時的に終了できます。
exit//指定されたセッションに入ったらexitを実行してセッションを閉じます。