PS 或 /proc/ 中未列出的进程

PS 或 /proc/ 中未列出的进程

我正在尝试弄清楚如何操作一个相当大的 Java 程序“prog”。如果我转到它的 /bin/ 目录并配置它的 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 start 时,它启动了。但我在进程列表中根本找不到它。我也无法使用 shell 脚本使用的相同命令手动终止它。但我可以知道它正在运行,因为如果我执行 ./prog.sh stop,它就会停止(并且其他地方的一些临时文件会自行清除)。

./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/ 中找到它,也无法终止它。但 shell 脚本仍然可以正确停止它。所以我的问题是,这种情况怎么会发生?该进程是否被极度隐藏,实际上未被列出,还是我只是以某种方式错过了它?我试图弄清楚是什么让这个程序运行,但我几乎无法证明它正在运行!

编辑:

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 并抑制所有输出然后删除临时文件并手动插入已停止并进入日志文件。因此,当我对进程执行 ps 时,我不再那么确定该进程是否一直在运行,尽管上面的代码示例表明它至少运行不稳定。明天上班时,我会继续研究这个未记录的庞然大物。

答案1

由于您正在将其作为后台进程运行,因此PID$!是 ,su而不是$_CMD。您应该将 移到&结束引号内。

使用pidof或者pgrep来获取进程的 PID,而不是使用$!。如果您的系统使用 Upstart 或具有类似的守护进程系统,则应以它们为模板来编写脚本,并使用或类似的函数/lib/lsb/init-functions

答案2

至于进程不可见,我在使用 java 时也遇到了同样的问题。尝试:

ps auxm

(注意:没有破折号!)

这可能是一个线程,ps 在大多数情况下似乎不会显示它。

相关内容