在 Linux 系统里运行 jar 包,输完命令一关终端,程序就跟着停了;想关掉程序吧,又不知道怎么找进程,结果越开越多,最后服务器都卡了 —— 是不是特别头疼?其实 Linux 后台运行 jar 包有专门的命令,关闭的时候也有技巧,只要按步骤来,既能让程序稳定跑着,又能避免进程残留。今天小编就把这些方法讲清楚,新手也能一看就会。
一、先搞懂:为啥普通命令关终端就停?
可能有人会问:“我用‘java -jar 程序.jar’运行得好好的,为啥关了终端就没了?” 因为这个命令是 “前台运行”,程序和终端绑在一起了,终端关掉,程序自然就停了。
就像你在电脑上打开个文档,要是把文档窗口关了,内容肯定看不了了。后台运行就不一样,相当于把文档最小化到托盘,窗口关了,程序还在后台跑着。
小编第一次在 Linux 上部署程序时,就是用前台运行,出去吃了个饭,终端超时断开了,程序也停了,回来白忙活一场。
二、后台运行命令:这两个最常用,各有好处
Linux 后台运行 jar 包有两种常用命令,适合不同场景,一起往下看吧!
- nohup 命令(最推荐,日志还能存起来)
命令格式:nohup java -jar 程序.jar &
比如运行 “app.jar”,就输:nohup java -jar app.jar &
- 关终端、断连接都不影响程序运行。
- 会自动生成 “nohup.out” 文件,程序输出的日志都存在这里,方便以后查看。
使用时要注意:
- 输完命令会显示进程号(比如 “[1] 12345”,12345 就是进程号),最好记下来,后面关程序要用。
- 如果想指定日志文件,可以加参数:
nohup java -jar app.jar > app.log 2>&1 &
(日志就会存在 app.log 里,不会乱生成 nohup.out 了)
- screen 命令(适合需要随时切回前台的情况)
如果有时候需要查看程序输出,又不想重新运行,可以用 screen:
- 先输
screen
回车,会进入一个新窗口。 - 在新窗口里输
java -jar app.jar
运行程序。 - 按 “Ctrl+A” 再按 “D”,就能把窗口切到后台,此时可以安全关闭终端。
- 想再看程序输出,输
screen -r
就能切回去。
网友 “运维小张” 说:“调试程序的时候用 screen 特别方便,能随时切回去看日志,不用重新启动。”
三、关闭程序:按这步骤来,不会留残留
要是直接关服务器或者杀进程不彻底,很容易留下残留进程,占用资源。正确的关闭方法分两步:
- 找到进程号
输ps -ef | grep java
,会显示所有 Java 进程,找到你运行的 jar 包对应的那一行(比如能看到 “app.jar” 的字样),前面的数字就是进程号(PID)。
如果进程太多不好找,可以用更精确的命令:ps -ef | grep app.jar
(把 app.jar 换成你的文件名),这样只会显示相关进程。
- 杀死进程
找到进程号后,输kill -9 进程号
(比如kill -9 12345
),就能彻底杀死进程。
小编提醒:一定要用kill -9
,别用kill
(少了 – 9),不然可能杀不干净,还会留残留。之前有同事就因为没加 – 9,结果程序没彻底关掉,再启动时提示端口被占用,折腾了半天。
四、避免进程残留:这 3 个小技巧要记住
就算知道关闭方法,有时候还是会出问题,这几个技巧能帮你减少麻烦:
- 启动前先检查是否有旧进程
每次启动新程序前,先输ps -ef | grep 程序名.jar
看看有没有旧进程,有的话先杀掉再启动,避免多个进程同时运行。 - 用固定端口并检查端口占用
如果程序需要端口(比如 8080),启动前可以输netstat -tunlp | grep 8080
,看看端口有没有被占用,被占用的话要么杀进程,要么换端口。 - 写个启动脚本(适合经常操作的情况)
把启动和关闭命令写成脚本,以后不用每次输长命令:
- 新建文件:
vi start.sh
- 输入内容:plaintext
# 启动命令 nohup java -jar app.jar > app.log 2>&1 & # 显示进程号 echo "启动成功,进程号:$!"
- 保存后输
chmod +x start.sh
,以后输./start.sh
就能启动。
关闭脚本也类似,这样操作不容易出错。
五、自问自答:这些问题你可能也有
问:“用 nohup 启动后,日志文件越来越大怎么办?”
答:可以定期清理,或者在启动命令里加日志切割(比如用 logrotate 工具),新手简单点的话,每周手动删一次旧日志也行。
问:“杀死进程后,端口还是显示被占用,怎么回事?”
答:这是 “端口残留”,一般等几分钟会自动释放;如果着急,可以重启服务器,或者用netstat -tunlp | grep 端口号
找到占用端口的进程,再杀掉。
问:“有没有办法让程序开机自动后台运行?”
答:可以把启动命令加到 “/etc/rc.local” 文件里(注意加在 exit 0 前面),不过这个需要点 Linux 基础,新手可以先学会手动启动和关闭,再慢慢研究自动启动。
六、个人心得
Linux 后台运行 jar 包,核心就是 “用对启动命令,杀对进程”。nohup 命令简单又稳定,新手先把这个学会就行。每次操作前多检查一步 —— 启动前看看有没有旧进程,关闭后看看进程是不是真的没了,能避免很多麻烦。
小编建议把常用的命令记在备忘录里,比如启动、查进程、杀进程这三个,用得多了自然就记住了。另外,日志文件最好指定名字,别用默认的 nohup.out,不然时间长了都不知道哪个日志对应哪个程序。
其实这些操作不难,多练两次就熟了。希望这些方法能帮到你,让程序在 Linux 上跑稳当点,少出问题。