ホームページ >運用・保守 >Linuxの運用と保守 >Linux でシステムをバックグラウンドで実行する方法の説明

Linux でシステムをバックグラウンドで実行する方法の説明

巴扎黑
巴扎黑オリジナル
2017-08-22 13:53:591348ブラウズ

Linux サーバー上で長期タスクを実行したいのですが、ネットワークが不安定なため、タスクが途中で失敗することがよくあります。コマンドの送信後にターミナル ウィンドウをローカルで閉じるかネットワークを切断することによって、コマンドが干渉されるのを防ぐにはどうすればよいですか?

上記のニーズを簡単に満たすことができる方法は次の 3 つです。

問題分析:

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

3 つの解決策:

1. nohup

nohup は間違いなく私たちが考える最初の解決策です。名前が示すように、nohup の目的は、送信されたコマンドがハングアップ信号を無視するようにすることです。

nohup は、処理するコマンドの前に nohup を追加するだけで、デフォルトで標準出力と標準エラーが nohup.out ファイルにリダイレクトされます。通常、最後に「&」を追加してコマンドをバックグラウンドで同時に実行することも、「>filename 2>&1」を使用してデフォルトのリダイレクトファイル名を変更することもできます。

nohup の例

[root@pythontab ~]# nohup ping www.php.cn &
[1] 3059
nohup: appending output to `nohup.out'
[root@pythontab ~]# ps -ef |grep 3059
root      3059   984  0 15:06 pts/3    00:00:00 ping www.php.cn
root      3067   984  0 15:06 pts/3    00:00:00 grep 3059
[root@pythontab ~]#

2. etsid

nohup は HUP シグナルを無視することでプロセスの途中中断を防ぐことができるのは間違いありませんが、別の角度から考えると、プロセスが HUP シグナルを受け入れる端末の子プロセスに属していなければ、当然、信号は HUP の影響を受けません。 setid はこれを行うのに役立ちます。

setsid も非常に便利です。処理するコマンドの前に setsid を追加するだけです。

setsid の例

[root@pythontab ~]# setsid ping www.php.cn
[root@pythontab ~]# ps -ef |grep www.php.cn
root     31094     1  0 07:28 ?        00:00:00 ping www.php.cn
root     31102 29217  0 07:29 pts/4    00:00:00 grep www.php.cn
[root@pythontab ~]#

上記の例では、プロセス ID (PID) が 31094 であり、その親 ID (PPID) が 1 (つまり、初期プロセス ID) であることに注意してください。現在の端末IDの処理。

3. & サブシェル

サブシェルに関するもう 1 つの小さなヒントを紹介します。 "()" に 1 つ以上の名前を含めることで、これらのコマンドをサブシェルで実行できるようになり、多くの興味深い関数が拡張されることがわかっています。そのうちの 1 つをこれから説明します。

「()」の中に「&」を入れると、送信した求人は求人一覧にない、つまり求人から閲覧できないことが分かります。これにより HUP 信号の影響を回避できる理由を見てみましょう。

サブシェルの例

[root@pythontab ~]# (ping www.php.cn &)
[root@pythontab ~]# ps -ef |grep www.php.cn
root     16270     1  0 16:13 pts/4    00:00:00 ping www.php.cn
root     16278 15362  0 16:13 pts/4    00:00:00 grep www.php.cn
[root@pythontab ~]#

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

それに比べて、私はシンプルで実用的な setsid を使用することを好みます。もちろん、これは各人の好みに依存し、効果に大きな違いはありません。

以上がLinux でシステムをバックグラウンドで実行する方法の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。