如何获取此 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