1、背景描述
用Java编写了一个程序(可执行的jar),需要在Linux中启动并持续运行
1.1、直接执行程序
直接执行程序后,在程序执行期间,无法在当前会话中再执行其他操作
1.2、直接执行程序后中断
直接执行程序后,按Ctrl+C中断;这时虽然可以在当前会话中执行其他操作,但是程序也结束运行了
1.3、直接执行程序后开启新会话
直接执行程序后,在新会话中不仅可以执行其他操作,而且旧会话中的程序也还在持续运行
但是,把旧会话关闭后,程序也随之结束了
2、解决方式
2.1、使用 &
-
& :表示程序在后台运行,这样就可以在程序的执行期间,还能在当前会话中执行其他操作
-
使用格式:command &
注意:
在执行程序的命令后使用 > test.log 的作用,是为了将程序的输出信息从标准输出重定向到(test.log)文件中
单独使用 & , 只能实现在程序的执行期间,还能在当前会话中执行其他操作;但关闭当前会话,程序依然会自动结束
java -jar test_script.jar > test.log &
2.2、使用 nohup
-
nohup:英文全称 no hang up ,用于在系统中不挂断地运行命令,即使退出终端也不会影响程序的运行
-
使用格式:nohup command
注意:
单独使用 nohup ,只能实现关闭当前会话后,程序依然能继续运行,但无法在当前会话中再执行其他操作;
强行使用Ctrl+C中断的话,这时虽然可以在当前会话中执行其他操作,但是程序也结束运行了
nohup 会默认将程序的输出信息从标准输出重定向到当前目录的nohup.out文件中;
因此可以不用额外使用 > test.log 将程序的输出信息从标准输出重定向到(test.log)文件中
nohup java -jar test_script.jar
2.3、结合使用 nohup 和 &
单独使用 & , 只能实现在程序的执行期间,还能在当前会话中执行其他操作;但关闭当前会话,程序依然会自动结束
单独使用 nohup ,只能实现关闭当前会话后,程序依然能继续运行,但无法在当前会话中再执行其他操作
结合使用 nohup 和 & ,能同时实现:在程序的执行期间,还能在当前会话中执行其他操作;关闭当前会话后,程序依然能继续运行
- 结合使用格式:nohup command &
结合使用 nohup 和 & 后,无论是按回车,还是按Ctrl+C,或者是关闭当前会话,都不影响程序的运行
nohup java -jar test_script.jar &
3、扩展知识
当结合使用 nohup 和 & 执行程序后,要么程序执行完毕后自动结束(如果程序有结束条件),要么手动结束该进程
-
ps -aux | grep 程序名:通过程序名找到进程信息
-
kill -9 进程ID:通过进程ID结束进程