作为java程序员,经常会遇到这样一个问题,打个jar包,测试或者上线生产,于是乎面临的选择来了,java –jar or nohup?
一、 # java -jar x.jar &
直接启动jar文件,在当前会话进程中开启一个子进程来运行程序,这个子进程会随着会话进程的结束而结束。
这种情况适合短时间测试用。
二、 # nohup java -jar x.jar &
先熟悉一下相关名词:
hangup (挂断),终端退出时会发送 hangup 信号来通知其关闭所有子进程
nohup(不挂断,忽略挂断信号)
nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。
一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename2>&1"来更改缺省的重定向文件名。
# nohup java -jar x.jar > jar.log 2>&1 &
执行后程序会在后台运行,适合在生产环境长时间运行。
三、如果服务器重启了,怎么实现程序的开机自启呢?
在CentOS7上,我们可以将其注册为系统服务,用systemd管理
在用systemd控制前,我们需要用shell脚本对其做封装
# cat /usr/local/bin/testJar.sh
#####################################
#!/bin/bash
export JAVA_BIN="/opt/jre18.0_151/bin"
export PATH=$JAVA_BIN:$PATH
start () {
nohup java -jar /path/to/x.jar >> /path/to/jar.log 2>&1 &
}
stop () {
ps aux | grep "path/to/x.jar" | awk '{print $2}' | xargs kill -9
}
restart () {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "start|stop|restart"
esac
######################################
# chmod +x /usr/local/bin/testJar.sh
# vim /etc/systemd/system/testJar.service
##############################
[Unit]
Description=testJar service daemon
[Service]
ExecStart=/usr/local/bin/testJar.sh start
ExecStop=/usr/local/bin/testJar.sh stop
ExecReload=/usr/local/bin/testJar.sh relaod
[Install]
WantedBy=multi-user.target
##############################
# systemctl daemon-reload
# systemctl start testJar.service
# systemctl enable testJar.service
# systemctl status testJar.service