バックグラウンドで実行されているいくつかの方法のLinuxプロセス - nohupを/がsetsid /&

バックグラウンドで実行されているいくつかの方法のLinuxプロセス - nohupを/がsetsid /&[転載]

 

私たちはしばしば、この問題が発生した時間のかかるタスクの数を実行し、telnetの/ SSHリモートログインのLinuxサーバーを使用し、結果が不安定なネットワークにある中断されまし使命を主導しました。どのように近いターミナルウィンドウのコマンドの後にネットワークから切断/地元の干渉なしにそれを提出するには?いくつかの例を与える以下は、この問題に対処するための異なるシナリオのためのさまざまな方法を選択することができます。

NOH アップ/がsetsid /&

シーン:

あなただけの一時的なコマンドは、長い時間のために実行する必要がある場合、どのようにバックグラウンドで実行され安定していることを保証する最も簡単な方法することができますか?

<WBR> nohupを/がsetsid /&<WBR> [予約]  -  <WBR>バックグラウンドで実行されているいくつかの方法のLinuxプロセス
理由ハングアップ名
のUnixの以前のバージョンでは、各端末は、モデムおよび通信システムを介してであろう。ときに、ユーザーのログアウト、モデムが(ハングアップ)電話をハングします。モデムが切断された場合も同様に、端末は、その子プロセスの全てをシャットダウンするハングアップ通知に信号を送ります。

ソリューション:

私たちは、ユーザーがログオフ(ログアウト)、またはネットワークから切断する場合、端末はその子プロセスのすべてを閉じるためにHUP(ハングアップ)信号を受信することを知っています。そのため、当社のソリューションは、2つの方法があります:プロセスがHUPシグナルを無視することができ、または子になるために新しいセッションで実行プロセスがこの端末に属していませんしましょうどちらか。

1. nohupを

nohupは、間違いなく私たちが最初に考えた方法です。名前が示すように、それがハングアップ信号を無視して提出するコマンドnohupを利用することです。nohupはヘルプ情報を初めて目にしてみましょう:

NOHUP(1)ユーザがNOHUP(1)コマンド

名称
nohupをする-非TTY用に出力して、ハングアップにコマンド免疫を実行

形式
COMMAND [ARG] ... nohupを
nohupをOPTIONの

説明
ハングアップ信号を無視し、実行COMMAND。

このヘルプして終了表示--help

--version
バージョン情報を出力して終了します

目に見える、使用nohupはちょうどコマンドが処理される前に、標準出力と標準エラー出力をファイルnohup.outデフォルトにリダイレクトされますにnohupを追加し、非常に便利です。一般的に、我々はの最後に追加することができます「&」バックグラウンドで実行することも使用することができますが、コマンド内に配置されるように、デフォルトのファイル名のリダイレクトを変更します。">filename 2>&1"


nohupを例
 
[ルート@のpvcent107〜]#1 nohupをピングwww.ibm.com&
[1] 3059
nohupを: `nohup.out」に出力を追加し
ます。[root @ pvcent107〜]#psの-ef | grepを3059
ルート3059の  984  0 21時06 PTS / 3午前0時00分00秒のping www.ibm.comの
ルート3067 984 0夜九時06 PTS /午前0時00分00秒のgrep 3059 3
[ルート@ pvcent107〜]#

2.がsetsid

nohupは確かに中断されたプロセスを回避するために私達の方法を作るためにHUPシグナルを無視するが、プロセスは、受信端末、当社の子プロセスがHUPシグナルに属していない場合ならば、我々は、別の角度について考えることができ、その後、自然に、HUPシグナルによって影響されることはありませんA。がsetsidは、私たちはそれを行うことができます。がsetsidヘルプ情報を初めて目にしてみましょう:

がsetsidは、(8)のLinuxプログラマーズ・マニュアルがsetsid(8)

名前
がsetsid -新しいセッションでプログラムを実行する

書式
がsetsidプログラム[引数...]

説明
がsetsid新しいセッションでプログラムを実行します。

がsetsid見えるの使用は、コマンドを処理する前に、あなたもちょうどがsetsidを追加することができ、また、非常に便利です。


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

值得注意的是,上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。请将此例与nohup例中的父 ID 做比较。

3. &

这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。

当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。


subshell 示例
 
[ルート@ pvcent107〜]#(ピングwww.ibm.com&)
[ルートの@ pvcent107〜]#psの-ef | grepをwww.ibm.com
ルート16270  1  0午後2時13分、PTS / 4 0時00分〇 〇秒のping WWW .ibm.com
ルート16278 15362 0 14:13のpts / 4午前0時00分00秒のgrep www.ibm.com
[ルート@のpvcent107〜]#

上記の例から分かるように、親ID(PPID)が新しいプロセス1(PIDのinitプロセス)日出願、現在のプロセスは、端末のIDではありません。そのため、子供は現在の端末のHUPシグナルによって影響されることはありません、現在の端末に属していません。

おすすめ

転載: www.cnblogs.com/mikew/p/11730132.html