Processo non elencato da PS o in / proc /


4

Sto cercando di capire come far funzionare un programma Java piuttosto grande, "prog". Se vado in / bin / dir e configuro setenv.sh e prog.sh per utilizzare le directory locali e il mio account utente corrente. Quindi provo a eseguirlo tramite "./prog.sh start". Ecco tutti i bit rilevanti di prog.sh:

USER=(my current account)
_CMD="/opt/jdk/bin/java -server -Xmx768m -classpath "${CLASSPATH}" -jar "${DIR}/prog.jar""
case "${ACTION}" in
    start)
        nohup su ${USER} -c "exec ${_CMD} >>${_LOGFILE} 2>&1" >/dev/null &
        echo $! >${_PID}
        echo "Prog running. PID="`cat ${_PID}`
        ;;
    stop)
        PID=`cat ${_PID} 2>/dev/null`
        echo "Shutting down prog: ${PID}
        kill -QUIT ${PID} 2>/dev/null
        kill ${PID} 2>/dev/null
        kill -KILL ${PID} 2>/dev/null
        rm -f ${_PID}
        echo "STOPPED `date`" >>${_LOGFILE}
        ;;

Quando inizio davvero ./prog.sh, inizia. Ma non lo trovo affatto nell'elenco dei processi. Né posso ucciderlo manualmente, usando lo stesso comando usato dallo script della shell. Ma posso dire che è in esecuzione, perché se lo faccio ./prog.sh si ferma, si ferma (e alcuni file temporanei altrove si puliscono da soli).

./prog.sh start
Prog running. PID=1234
ps eaux | grep 1234
ps eaux | grep -i prog.jar
ps eaux >> pslist.txt
(It's not there either by PID or any clear name I can find: prog, java or jar.)
cd /proc/1234/
-bash: cd: /proc/1234/: No such file or directory
kill -QUIT 1234
kill 1234
kill -KILL 1234
-bash: kill: (1234) - No such process
./prog.sh stop
Shutting down prog: 1234

Per quanto ne so, il processo è in esecuzione ma non è elencato in alcun modo dal sistema. Non riesco a trovarlo in ps o / proc /, né posso ucciderlo. Ma lo script della shell può ancora fermarlo correttamente. Quindi la mia domanda è: come può succedere qualcosa del genere? Il processo è estremamente nascosto, in realtà non elencato o mi manca in qualche modo? Sto cercando di capire cosa fa battere questo programma e riesco a malapena a provare che funziona!

Modificare:

ps eu | grep prog.sh (after having restarted; so random PID)
50038    19381  0.0  0.0  4412  632 pts/3    S+   16:09   0:00 grep prog.sh HOSTNAME=machine.server.com TERM=vt100 SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=::[STUFF] 1754 22 CVSROOT=:[DIR] SSH_TTY=/dev/pts/3 ANT_HOME=/opt/apache-ant-1.7.1 USER=[USER] LS_COLORS=[COLORS] SSH_AUTH_SOCK=[DIR] KDEDIR=/usr MAIL=[DIR] PATH=[DIRS] INPUTRC=/etc/inputrc PWD=[PWD] JAVA_HOME=/opt/jdk1.6.0_21 LANG=en_US.UTF-8 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass M2_HOME=/opt/apache-maven-2.2.1 SHLVL=1 HOME=[~] LOGNAME=[USER] SSH_CONNECTION=::[STUFF] LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/grep OLDPWD=[DIR]

Ho appena capito che la parte stop) di prog.sh non è in realtà una garanzia che il processo che afferma di essere in arresto è in esecuzione: cerca solo di eliminare il PID e sopprime tutto l'output, quindi elimina il file temporaneo e inserisce manualmente STOPPED nel file di registro. Quindi non sono più così sicuro che il processo sia sempre in esecuzione quando lo ps per esso, anche se l'esempio di codice sopra indica che almeno funziona in modo errato. Continuerò a esaminare questo colosso privo di documenti quando tornerò al lavoro domani.


Cosa produce il seguente comando? ps eu | grep prog.sh
BloodPhilia,

Lo modificherò nel post, poiché sono circa 1.000 caratteri troppo lunghi per essere inseriti qui. Anche se potrei doverlo modificare leggermente, dal momento che non credo di poter divulgare molte informazioni sui sistemi in cui mi trovo.
Hammer Bro.

Il nome del processo può essere java, non prog. Hai provato a cercare un processo Java?
MBraedley,

Risposte:


1

Il $!PID è quello di supoiché lo stai facendo da sfondo piuttosto che dal tuo $_CMD. Dovresti spostare l' &interno della citazione di chiusura.

Utilizzare pidofo pgrepper ottenere il PID del processo anziché utilizzare $!. Se utilizzi un sistema che utilizza Upstart o ha un sistema demone simile, dovresti modellare lo script in base a quelli e utilizzare le funzioni in /lib/lsb/init-functionso simili.


Qui ci deve essere più di quanto sembri. Se sposto & all'interno della citazione di chiusura, l'attività si blocca, sebbene venga visualizzata su ps come "su [utente] -c exec / opt / jdk / jre / bin / java -server Xmx768m -D [parametri Java e loro valori] -jar [...] / prog.jar >> [logdir] /log.file 2> & 1 & "La console si blocca e ^ C non farà nulla. Se lo uccido tramite un altro terminale, la console si sbilancia, tranne per il fatto che l'unico input che ha qualche effetto è ^ C, il che fa apparire un altro prompt. Nessun altro tasto funziona. Non sono sicuro del motivo per cui questo comando è sospeso, in quanto sembra buono per quanto posso dire.
Hammer Bro.

Si sta ancora terminando in modo anomalo e irregolare, ma posso almeno dire cosa sta succedendo ora grazie alla tua & osservazione. In realtà mi chiedo come funzioni la sua forma originale, se $! restituisce il PID di su, ma deve funzionare in qualche modo poiché è lo script utilizzato dalle versioni di produzione. Almeno sto ottenendo un PID e ... oh, ehi, i file di registro ora ottengono Java Exceptions e Stack Traces. Sono in affari! Grazie.
Hammer Bro.

@Hammer Bro .: Potresti già saperlo, ma usa il resetcomando (digitandolo cieco, se necessario, dopo aver premuto Invio o ^ C) per impedire al terminale di comportarsi male dopo aver ucciso il programma.
Dennis Williamson,

2

Per quanto riguarda il processo non essendo visibile, ho riscontrato la stessa cosa con Java. Provare:

ps auxm

(nota: nessun trattino!)

Probabilmente è un thread, che ps non sembra mostrare nella maggior parte dei casi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.