作為java程序員凰慈,經(jīng)常會(huì)遇到這樣一個(gè)問題菱属,打個(gè)jar包钳榨,測(cè)試或者上線生產(chǎn),于是乎面臨的選擇來了纽门,java –jar or nohup重绷?
一、 # java -jar? x.jar &
直接啟動(dòng)jar文件膜毁,在當(dāng)前會(huì)話進(jìn)程中開啟一個(gè)子進(jìn)程來運(yùn)行程序昭卓,這個(gè)子進(jìn)程會(huì)隨著會(huì)話進(jìn)程的結(jié)束而結(jié)束。
這種情況適合短時(shí)間測(cè)試用瘟滨。
二候醒、 # nohup java -jar x.jar &
先熟悉一下相關(guān)名詞:
hangup (掛斷),終端退出時(shí)會(huì)發(fā)送 hangup 信號(hào)來通知其關(guān)閉所有子進(jìn)程
nohup(不掛斷杂瘸,忽略掛斷信號(hào))
nohup 的使用是十分方便的倒淫,只需在要處理的命令前加上 nohup 即可,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤缺省會(huì)被重定向到 nohup.out 文件中败玉。
一般我們可在結(jié)尾加上"&"來將命令同時(shí)放入后臺(tái)運(yùn)行敌土,也可用">filename2>&1"來更改缺省的重定向文件名。
# nohup java -jar x.jar > jar.log 2>&1 &
執(zhí)行后程序會(huì)在后臺(tái)運(yùn)行运翼,適合在生產(chǎn)環(huán)境長(zhǎng)時(shí)間運(yùn)行返干。
三、如果服務(wù)器重啟了血淌,怎么實(shí)現(xiàn)程序的開機(jī)自啟呢矩欠?
在CentOS7上财剖,我們可以將其注冊(cè)為系統(tǒng)服務(wù),用systemd管理
在用systemd控制前癌淮,我們需要用shell腳本對(duì)其做封裝
# 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