我的(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应用程序。 start-stop-daemon不会知道哪个PID属于这个特定的应用程序,也无法弄清楚我应该在init.d脚本中提供什么。
答案 0 :(得分:3)
如果您的系统安装了jdk,则会有一个名为jps的实用程序驻留在jdk / bin中。它将显示正在运行的java进程列表。利用它。
如果你的机器上没有安装jdk,那么你必须从ps -eaf命令grep java进程。
答案 1 :(得分:2)
如果你想从命令行获得pid,这可能有效:
myCommand & echo $!
我从已接受的回复中复制到ServerFault中一个非常相似的主题:https://serverfault.com/a/205504