ホームページ  >  記事  >  運用・保守  >  Linuxでプロセスをバックグラウンドで実行する3つの方法を詳しく解説

Linuxでプロセスをバックグラウンドで実行する3つの方法を詳しく解説

黄舟
黄舟オリジナル
2017-06-07 10:32:394453ブラウズ

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

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

問題分析:

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

3 つの解決策:

1. nohup

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

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

filename 2>&1」を使用してデフォルトのリダイレクトファイル名を変更することもできます。

nohup の例

[root@pythontab ~]# nohup ping www.pythontab.com &
[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.pythontab.com
root      3067   984  0 15:06 pts/3    00:00:00 grep 3059
[root@pythontab ~]#

2.

setsid

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

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

setsid の例

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

上記の例では、プロセス ID (PID) が 31094 であり、

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

3. & サブシェル

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

「()」の中に「&」を入れると、送信された

ジョブがジョブリストにない、つまりジョブを通じて閲覧できないことがわかります。これにより HUP 信号の影響を回避できる理由を見てみましょう。

サブシェルの例

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

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

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

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

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