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.
ps eu | grep prog.sh