産卵プロセスのソースを見つける方法?


12

RedHat LinuxインスタンスでJavaプロセスを実行しています。

問題は、私がそれを殺した後、それが再び現れ続けることです。どこを見ればいいのか分かりません。私はすでにcrontabに行きましたが、運はありません。

PPIDを確認しましたが、init(1)を指します。

どのようにしてソースを見つけることができますか?


1
続けてください。プロセスは、たとえばファイルに書き込みますか?ps xfプロセスツリーの表示の出力を表示できますか?現状では、進むべきことはほとんどありません。
テルドン

あなたはcrontabに行ったと言いました... atそれらのどれかが1つであるかどうかも確認しましたか?
YoMismo 14年

実際に実行しているJavaソフトウェアを教えてください。Cassandraのようなツールを見てきました。実際には、特定のセットアップに組み込みのウ​​ォッチドッグがあり、最初のインスタンスが失敗した(正常に停止しなかった)ときにデータベースの別のインスタンスを起動します。
マティアススタインバウアー14年

回答:


15

いくつかの可能性があります(他の回答で言及されているものもあります):

  1. 頻繁に実行されるシステムまたはユーザーcronjob、
  2. SysV init /etc/inittabで、respawnディレクティブを使用したサービスのエントリ、
  3. systemdには、とのユニットファイルRestart以外の値にオプションが設定されno
  4. Upstartでは、respawnディレクティブを含むサービス構成ファイル、
  5. などのプロセス監視ツールmonit、または
  6. その特定のサービスのアドホックウォッチドッグプロセス。

プロセスが開始されている場所についてより多くの洞察を提供できる興味深い新しい(Linuxのみの)ツールはsysdigです。

Sysdigは、Linuxカーネルのトレースポイント機能を使用して、高速でシステム全体に及ぶものを提供しますstrace

たとえば、すべてのプロセスが開始されるのを確認したい場合ls、次を発行できます。

sudo sysdig evt.type=execve and evt.arg.exe=ls

ときにlsどこかを実行している、私はこのようなメッセージが表示されます。

245490 16:53:54.090856066 3 ls (10053) < execve res=0 exe=ls args=--color=auto. tid=10053(ls) pid=10053(ls) ptid=9204(bash) cwd=/home/steved fdlimit=1024 pgft_maj=0 pgft_min=37 vm_size=412 vm_rss=4 vm_swap=0 env=...

返された環境情報は切り捨てましたが、ご覧のとおり、ptidでexecveを呼び出しているプログラムの名前とpidを確認できます。 execveLinuxで使用されるシステムコールは、新しいコマンドの実行に使用されます(他のすべてのexecコールは、単にexecveのフロントエンドです)。


2
sysdigは素晴らしいアドバイスです!ところで、機能が制限されたWindows(およびMac)で利用できるようになりました。
ネオウィザード

ここでmonitはどのように役立ちますか?私はマニュアルを読み始めましたが、Nagiosのようなものの代替品またはバックアップのように見えます。リスポーンプロセスを追跡するのにどのように役立つかわかりません。
ジェファーソンハドソン

7

使用できると思いますpstree。次のようにコマンドを指定できます。

pstree -p PID

上記は、Javaアプリケーションのすべての親のリストを提供します。


1
OPは、すでに彼は1ですPPID、見て言ったようにこれは、すべての助けにはなりません
ガントラムBLOHMはモニカサポートして

@GuntramBlohm、編集前の元の質問をご覧ください。質問の最初のバージョンでは言及されていません。
ラメシュ14年

2
はぁ。編集をマークせずに質問を移動ターゲットにする別のポスター:(
Guntram BlohmがサポートするMonica 14年

5

PPID(親プロセスID)を見ることができます:

$ ps -eo pid,ppid,args | grep java

JavaプロセスのPPID(2番目の列)を取得したら、ps再度使用して、関連するプロセスを見つけます。

$ ps -p [PPID]

編集:親が1(初期)の場合、Javaプロセスの最初の親は「出産」の直後に死亡しました(どれだけ悲しいか)。そのため、現在のプロセス階層を使用して検索することはできません。最初に行うことをお勧めすることはチェックすることps -efです。出力を読むだけで犯人を見つけることができます。

次に、crontabを確認します(既に実行していますが、問題はありません)。

$ for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done

これにはルート権限が必要です。

スケジュールされたJavaプロセスがまだ表示されませんか?それをやった。他のことを試してみましょう。ブート後にJavaプロセスが存在する場合は、ブート時にスケジュールされるプログラムを調べてください。私は次のようなものを提案します...

$ grep -iR java /etc/rc*

それでも何も見つからない場合...アイデアが不足していることを認めます。をもう一度見てps -ef、Javaベースのプログラムに関連付けられているプロセスを見つけてください。Javaプロセスの絶え間ない再生成を担当するデーモンまたは「ランチャー」に出くわす必要があります。


親プロセスを検索しようとしましたが、それはinit(PPID = 1)を指しているだけです。この情報で質問を修正します。
ホセ

@ JoseChavez、PPIDが1の場合、作成されるJavaプロセスはゾンビプロセスです。こちらの回答をご覧ください
ラメシュ

@JoseChavezあなたのケースで調査するために、さらにいくつかのトラックで回答を編集しました。
ジョンWHスミス

2
@Ramesh PPIDが1の場合、ゾンビである場合とそうでない場合があります。彼らが実際に生まれていないなら、彼らは少なくとも孤児です。の指定子は、それらがゾンビかどうかを示します(例:)。状態はになります。initstatepsps -eo pid,ppid,state,commZ
goldilocks

1
@goldilocks:PPIDが1の場合、initプロセスが誤動作していない限り、ゾンビはありません。すべての孤立したゾンビをすぐに収獲する待機ループを実行する必要があります。
hmakholmはモニカに14年

1

誰が親であるかわからない場合は、auditdなどのシステムトレーサーを使用する必要があります。

次を使用してロギングを有効にします。

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

そして、次の/var/log/audit/audit.logような行を見つけます:

type=SYSCALL msg=audit(1414027338.620:6232): arch=c000003e syscall=59
success=yes exit=0 a0=7fdea0e4db23 a1=7fffec7c5220 a2=7fffec7c87d0
a3=7fdea1b559d0 items=2 ppid=17176 pid=18182 auid=1000 uid=1000 gid=1000 
euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts8 
ses=2 comm="sh" exe="/bin/dash" key=(null)

(読みやすくするために複数行に分けています)。あなたは興味のあるexe="/bin/dash"および/またはpid=18182そのあなたが見てみたい、とあなたの口紅のプロセスを識別するppid=17176かを識別する、それを実行する親を。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.