RedHat LinuxインスタンスでJavaプロセスを実行しています。
問題は、私がそれを殺した後、それが再び現れ続けることです。どこを見ればいいのか分かりません。私はすでにcrontabに行きましたが、運はありません。
PPIDを確認しましたが、init(1)を指します。
どのようにしてソースを見つけることができますか?
at
それらのどれかが1つであるかどうかも確認しましたか?
RedHat LinuxインスタンスでJavaプロセスを実行しています。
問題は、私がそれを殺した後、それが再び現れ続けることです。どこを見ればいいのか分かりません。私はすでにcrontabに行きましたが、運はありません。
PPIDを確認しましたが、init(1)を指します。
どのようにしてソースを見つけることができますか?
at
それらのどれかが1つであるかどうかも確認しましたか?
回答:
いくつかの可能性があります(他の回答で言及されているものもあります):
/etc/inittab
で、respawn
ディレクティブを使用したサービスのエントリ、Restart
以外の値にオプションが設定されno
、respawn
ディレクティブを含むサービス構成ファイル、monit
、またはプロセスが開始されている場所についてより多くの洞察を提供できる興味深い新しい(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を確認できます。 execve
Linuxで使用されるシステムコールは、新しいコマンドの実行に使用されます(他のすべてのexecコールは、単にexecveのフロントエンドです)。
使用できると思いますpstree
。次のようにコマンドを指定できます。
pstree -p PID
上記は、Javaアプリケーションのすべての親のリストを提供します。
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
state
ps
ps -eo pid,ppid,state,comm
Z
誰が親であるかわからない場合は、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
かを識別する、それを実行する親を。
ps xf
プロセスツリーの表示の出力を表示できますか?現状では、進むべきことはほとんどありません。