如何获取此 Java 应用程序的 PID?
How do I get the PID of this Java app?
我的 (Ubuntu) 服务器上有一个 java 应用程序。如果我这样做,那么它会正确启动:
/usr/bin/java -cp /home/jenkins/veta/lily.jar com.sugarapp.lily.Main
但我不知道如何获取它的PID。我不知道如何用 init.d 脚本停止它。
我有一个不同的应用程序,它是用 Clojure 编写的,为此我能够编写一个运行良好的 init.d 脚本。所以我尝试为我的 Java 应用重新设计 init.d 脚本,这就是我得到的:
WORK_DIR="/home/jenkins/veta"
NAME="lily"
JAR="lily.jar"
USER="jenkins"
DAEMON="/usr/bin/java"
DAEMON_ARGS=" -cp /home/jenkins/veta/lily.jar com.sugarapp.lily.Main"
start () {
echo "Starting lily..."
if [ ! -f $WORK_DIR/lily.pid ]; then
/sbin/start-stop-daemon --start --verbose --background --chdir $WORK_DIR --exec $DAEMON --pidfile $WORK_DIR/lily.pid --chuid "$USER" --make-pidfile -- $DAEMON_ARGS
else
echo "lily is already running..."
fi
}
stop () {
echo "Stopping lily..."
/sbin/start-stop-daemon --stop --exec $DAEMON --pidfile $WORK_DIR/lily.pid
rm $WORK_DIR/lily.pid
}
但这不起作用。虽然每次我 运行 脚本时 $WORK_DIR/lily.pid 中的 PID 都会改变,但似乎没有使用该 PID 的进程 运行。如果我尝试:
ps aux | grep java
我没有看到这个应用程序,也没有看到我尝试使用 PID。
有没有一种方法我可以使用第一个命令,但以某种方式捕获 PID,以便我可以存储它供以后使用?
我只是想要一种可靠的方式来停止和启动这个应用程序。这可能是由 PID 或其他一些因素引起的。我愿意接受建议。
更新:
可能是我的问题不清楚?像 jps 或 ps 这样的东西会给我太多答案。如果我执行 "ps aux | grep java" 之类的操作,我会看到服务器上有 5 个不同的 java apps 运行ning。 start-stop-daemon 不知道哪个 PID 属于这个特定的应用程序,我也不知道我应该将什么输入到我的 init.d 脚本中。
如果您的系统安装了 jdk,则在 jdk/bin 中有一个名为 jps 的实用程序。它将显示 运行 java 个进程的列表。好好利用吧。
如果您的机器上没有安装 jdk,那么您必须从 ps -eaf 命令中 grep java 进程。
如果你想从命令行获取 pid,这可能有效:
myCommand & echo $!
我从已接受的回复中复制到 ServerFault 中一个非常相似的主题:https://serverfault.com/a/205504
我的 (Ubuntu) 服务器上有一个 java 应用程序。如果我这样做,那么它会正确启动:
/usr/bin/java -cp /home/jenkins/veta/lily.jar com.sugarapp.lily.Main
但我不知道如何获取它的PID。我不知道如何用 init.d 脚本停止它。
我有一个不同的应用程序,它是用 Clojure 编写的,为此我能够编写一个运行良好的 init.d 脚本。所以我尝试为我的 Java 应用重新设计 init.d 脚本,这就是我得到的:
WORK_DIR="/home/jenkins/veta"
NAME="lily"
JAR="lily.jar"
USER="jenkins"
DAEMON="/usr/bin/java"
DAEMON_ARGS=" -cp /home/jenkins/veta/lily.jar com.sugarapp.lily.Main"
start () {
echo "Starting lily..."
if [ ! -f $WORK_DIR/lily.pid ]; then
/sbin/start-stop-daemon --start --verbose --background --chdir $WORK_DIR --exec $DAEMON --pidfile $WORK_DIR/lily.pid --chuid "$USER" --make-pidfile -- $DAEMON_ARGS
else
echo "lily is already running..."
fi
}
stop () {
echo "Stopping lily..."
/sbin/start-stop-daemon --stop --exec $DAEMON --pidfile $WORK_DIR/lily.pid
rm $WORK_DIR/lily.pid
}
但这不起作用。虽然每次我 运行 脚本时 $WORK_DIR/lily.pid 中的 PID 都会改变,但似乎没有使用该 PID 的进程 运行。如果我尝试:
ps aux | grep java
我没有看到这个应用程序,也没有看到我尝试使用 PID。
有没有一种方法我可以使用第一个命令,但以某种方式捕获 PID,以便我可以存储它供以后使用?
我只是想要一种可靠的方式来停止和启动这个应用程序。这可能是由 PID 或其他一些因素引起的。我愿意接受建议。
更新:
可能是我的问题不清楚?像 jps 或 ps 这样的东西会给我太多答案。如果我执行 "ps aux | grep java" 之类的操作,我会看到服务器上有 5 个不同的 java apps 运行ning。 start-stop-daemon 不知道哪个 PID 属于这个特定的应用程序,我也不知道我应该将什么输入到我的 init.d 脚本中。
如果您的系统安装了 jdk,则在 jdk/bin 中有一个名为 jps 的实用程序。它将显示 运行 java 个进程的列表。好好利用吧。
如果您的机器上没有安装 jdk,那么您必须从 ps -eaf 命令中 grep java 进程。
如果你想从命令行获取 pid,这可能有效:
myCommand & echo $!
我从已接受的回复中复制到 ServerFault 中一个非常相似的主题:https://serverfault.com/a/205504