Processo não listado por PS ou em / proc /

4

Estou tentando descobrir como operar um programa Java bastante grande, 'prog'. Se eu for ao seu / bin / dir e configurar seu setenv.sh e prog.sh para usar diretórios locais e minha conta de usuário atual. Então eu tento executá-lo via "./prog.sh start". Aqui estão todos os bits relevantes do 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 eu realmente começo o ./prog.sh, ele começa. Mas não consigo encontrá-lo na lista de processos. Também não posso matá-lo manualmente, usando o mesmo comando que o script de shell usa. Mas eu posso dizer que está em execução, porque se eu fizer ./prog.sh parar, ele pára (e alguns arquivos temporários em outro lugar se limpam).

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

Tanto quanto eu posso dizer, o processo está sendo executado e não listado pelo sistema. Não consigo encontrá-lo em ps ou / proc /, nem posso matá-lo. Mas o script de shell ainda pode pará-lo corretamente. Então, minha pergunta é: como algo assim pode acontecer? O processo é supremamente oculto, na verdade não listado, ou estou apenas perdendo isso de alguma forma? Estou tentando descobrir o que faz este programa funcionar, e mal posso provar que está correndo!

Editar:

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]

Eu acabei de perceber que a parte stop do prog.sh não é realmente uma garantia de que o processo que ele diz estar parando está rodando - ele apenas tenta matar o PID e suprime toda a saída então exclui o arquivo temporário e insere manualmente STOPPED no arquivo de log. Então, eu não tenho mais tanta certeza de que o processo está sempre em execução quando eu ps para ele, embora o exemplo de código acima indica que, pelo menos, é executado de forma irregular. Eu continuarei olhando para este gigante não documentado quando eu retornar ao trabalho amanhã.

    
por Hammer Bro. 04.11.2010 / 00:04

2 respostas

1

O $! PID é de su , já que você está usando o segundo plano em vez de usar $_CMD . Você deve mover o & dentro da cotação de fechamento.

Use pidof ou pgrep para obter o PID do seu processo em vez de usar $! . Se você está em um sistema que usa Upstart ou possui um sistema de daemon similar, você deve modelar seu script depois deles e usar as funções em /lib/lsb/init-functions ou similar.

    
por 04.11.2010 / 02:12
2

Quanto ao processo não ser visível, eu encontrei a mesma coisa com o java. Experimente:

ps auxm

(nota: nenhum traço!)

Provavelmente é um tópico, o qual o ps não parece mostrar na maioria dos casos.

    
por 13.03.2011 / 00:33