Comment trouver la source du processus de frai?

12

J'ai un processus Java exécuté sur une instance Linux RedHat.

Le problème est qu'il continue de réapparaître après que je l'ai tué. Je ne sais pas où chercher. Je suis déjà allé à crontab, mais pas de chance.

J'ai regardé le PPID, mais il pointe vers init (1).

Une idée comment je peux trouver la source?

Jose
la source
1
Pouvez-vous nous donner quelque chose pour continuer? Le processus écrit-il dans des fichiers par exemple? Pouvez-vous nous montrer le résultat de l' ps xfaffichage de l'arbre de processus? À l'heure actuelle, nous avons très peu de choses à faire.
terdon
Vous avez dit que vous êtes allé à crontab ... Avez-vous également vérifié atsi l'un d'eux est celui-là?.
YoMismo
Pouvez-vous nous dire quel logiciel java vous utilisez actuellement? J'ai vu des outils comme Cassandra, qui ont en fait un chien de garde intégré dans certaines configurations qui déclenche simplement une autre instance de la base de données une fois que la première instance a échoué (n'a pas été gracieusement arrêtée).
Matthias Steinbauer

Réponses:

15

Il existe un certain nombre de possibilités (certaines mentionnées dans d'autres réponses):

  1. Un cronjob système ou utilisateur s'exécutant souvent,
  2. Dans SysV init, une /etc/inittabentrée pour le service avec la respawndirective,
  3. Dans systemd, un fichier d'unité avec l' Restartoption définie sur une valeur autre que no,
  4. Dans Upstart, un fichier de configuration de service avec la respawndirective,
  5. Un outil de surveillance des processus tel que monit, ou
  6. Un processus de surveillance ad hoc pour ce service particulier.

Sysdig est un nouvel outil intéressant (uniquement pour Linux) qui pourrait fournir plus d'informations sur le point de départ du processus .

Sysdig utilise les fonctionnalités de tracepoint du noyau Linux pour fournir ce qui équivaut à un système rapide et étendu strace.

Par exemple, si je voulais voir chaque processus démarrer ls, je peux émettre:

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

Quand lsest exécuté quelque part, je recevrai un message comme celui-ci:

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=...

J'ai tronqué les informations d'environnement retournées, mais comme vous pouvez le voir, dans le ptid, je peux voir le nom et le pid du programme appelant execve. execveest l'appel système utilisé sous Linux utilisé pour exécuter de nouvelles commandes (tous les autres appels exec ne sont que des frontends à exécuter).

Steven D
la source
2
sysdig est un excellent conseil! BTW, il est maintenant disponible pour Windows (et Mac, je pense) avec des fonctionnalités limitées.
Neowizard
Comment monit aide-t-il ici? J'ai commencé à lire le manuel, mais cela ressemble à une alternative ou à une sauvegarde de quelque chose comme Nagios. Je ne vois pas comment cela pourrait vous aider à retracer un processus de réapparition.
Jefferson Hudson
7

Je pense que vous pourriez utiliser pstree. Vous pouvez spécifier la commande comme,

pstree -p PID

Ce qui précède vous donnera une liste de tous les parents des applications java.

Ramesh
la source
1
Cela n'aidera pas du tout, car l'OP a déjà dit qu'il avait regardé le PPID, qui est 1.
Guntram Blohm soutient Monica
@GuntramBlohm, veuillez consulter la question d'origine avant de la modifier. Ce n'était pas mentionné dans la première version de la question.
Ramesh
2
soupir. Une autre affiche qui fait de sa question une cible mouvante sans marquer ses modifications :(
Guntram Blohm soutient Monica
5

Vous pouvez consulter son PPID (ID de processus parent):

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

Une fois que vous avez le PPID (deuxième colonne) de votre processus Java, utilisez à psnouveau pour trouver le processus associé:

$ ps -p [PPID]

Edit : si le parent est 1 (init), alors le premier parent de votre processus Java est mort juste après avoir "accouché" (c'est triste). Pour cette raison, vous ne pouvez pas utiliser la hiérarchie de processus actuelle pour la trouver. La première chose que je vous recommanderais de faire est de vérifier ps -ef. Vous pourriez trouver le coupable simplement en lisant la sortie.

Ensuite, jetez un œil aux crontabs (vous l'avez déjà fait, mais cela ne fera pas de mal):

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

Cela nécessitera des privilèges root.

Vous ne voyez toujours pas de processus Java planifié? Dang it. Essayons autre chose. Si votre processus Java est présent depuis le démarrage, jetez un œil aux programmes schéludés au démarrage. Je suggérerais quelque chose comme ...

$ grep -iR java /etc/rc*

Si vous ne trouvez toujours rien, alors ... J'avoue que je suis à court d'idées. Vous devriez vraiment avoir un autre regard ps -efet localiser les processus associés aux programmes basés sur Java. Vous devriez rencontrer un démon, ou un "lanceur", responsable de la réapparition constante de votre processus Java.

John WH Smith
la source
J'ai essayé de rechercher le processus parent, mais il pointe simplement vers init (PPID = 1). Je vais modifier la question avec cette info.
Jose
@JoseChavez, si votre PPID est 1, alors les processus java qui sont créés sont des processus zombies. Vérifiez cette réponse ici .
Ramesh
@JoseChavez J'ai édité ma réponse avec quelques pistes supplémentaires pour enquêter sur votre cas.
John WH Smith
2
@Ramesh Si le PPID est 1, ils peuvent ou non être des zombies . S'ils n'ont pas réellement été engendrés par init, ils sont au moins orphelins . Le statespécificateur à psaffichera s'il s'agit de zombies (par exemple, ps -eo pid,ppid,state,comm); l'état le sera Z.
goldilocks
1
@goldilocks: Si le PPID est 1, ce ne sont pas des zombies , sauf si le processus d'initialisation fonctionne mal; il devrait exécuter une boucle d'attente qui moissonne immédiatement tous les zombies orphelins.
hmakholm a quitté Monica
1

Si vous ne savez pas qui est le parent, vous devriez utiliser un traceur de système comme auditd

vous activez la journalisation avec:

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

puis dans les /var/log/audit/audit.loglignes de recherche comme:

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)

(divisé en plusieurs lignes pour plus de lisibilité). Vous êtes intéressé exe="/bin/dash"et / ou pid=18182identifiez le processus de rouge que vous souhaitez rechercher et ppid=17176identifiez le parent qui l'a exécuté.

Matija Nalis
la source