4

Я пытаюсь понять, как работать с довольно большой Java-программой prog. Если я захожу в его /bin / dir и настраиваю его setenv.sh и prog.sh для использования локальных каталогов и моей текущей учетной записи пользователя. Затем я пытаюсь запустить его через «./prog.sh start». Вот все соответствующие биты 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}
        ;;

Когда я действительно запускаю ./prog.sh, он запускается. Но я не могу найти его вообще в списке процессов. Также я не могу убить его вручную, используя ту же команду, что и скрипт оболочки. Но я могу сказать, что он работает, потому что если я остановлю ./prog.sh, он остановится (и некоторые временные файлы в другом месте вычистят себя).

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

Насколько я могу судить, процесс еще не запущен системой. Я не могу найти его в ps или /proc /, и при этом я не могу убить это. Но сценарий оболочки все равно может остановить его правильно. Итак, мой вопрос: как такое может произойти? Является ли процесс в высшей степени скрытым, фактически не включенным в список, или я просто упускаю его каким-то образом? Я пытаюсь понять, что заставляет эту программу работать, и я едва могу доказать, что она работает!

Редактировать:

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]

Я только что понял, что часть prog.sh stop) на самом деле не является гарантией того, что процесс, который, как он утверждает, останавливается, выполняется - он просто пытается убить PID и подавляет весь вывод, затем удаляет временный файл и вручную вставляет STOPPED в файл журнала. Так что я больше не уверен, что процесс всегда работает, когда я ps для него, хотя пример кода выше показывает, что он по крайней мере работает беспорядочно. Я продолжу изучать этого недокументированного бегемота, когда завтра вернусь на работу.

2 ответа2

2

Что касается невидимого процесса, я столкнулся с тем же самым с Java. Пытаться:

ps auxm

(примечание: нет тире!)

Вероятно, это поток, который в большинстве случаев ps не показывает.

1

$! PID - это su поскольку вы используете фон, а не свой $_CMD . Вы должны переместить & внутри заключительной цитаты.

Используйте pidof или pgrep чтобы получить PID процесса вместо использования $! , Если вы работаете в системе, которая использует Upstart или имеет аналогичную систему демонов, вы должны смоделировать свой скрипт после них и использовать функции в /lib/lsb/init-functions или аналогичные.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .