1、写在前面

由于工作中未使用过 Linux 操作系统,学习过的 Linux 相关的知识早已变得支离破碎。现在需要将智能机器人项目后台运行在 CentOS 上,不得不再走一遍 Linux 这条道。
对于 Linux 操作系统运行的应用程序,默认情况下都是前台运行( Forceground ),这会独占命令窗口,当退出命令窗口或者 Shell 会话时,运行的程序都会随之被中断退出,就像默默执行了一次 Ctrl + C 指令一样,这个机制不适合运行项目。
对此,我四处搜寻,找到一种最适合的解决方案,旨在解决能在 Linux 操作系统上后台运行程序,同时能方便管理:前后台切换、查看、挂起和继续。

2、可行的解决方案

2.1、方案一:使用 & 符号

2.1.1、使用示例

& 符号的用法很简单,就是在执行的命令末尾加上 &符号,该命令开启的进程即可在后台运行(background job),即成为“守护进程(daemon)”。

$ java -jar /home/QQChat/qq-bot-1.0-SNAPSHOT-execute.jar &

用这种方式执行命令,命令会被放到后台运行,当前命令窗口不会被占用,可继续执行其他命令。& 符号通常用在比较耗时的命令上,如拷贝大文件。

2.1.2、前后台任务管理

  1. 查看任务

通过命令 jobs 显示当前终端正在运行的进程,包括前台运行和后台运行的进程。它对每个正在执行中的进程任务分配了一个序号(这个序号不是进程 ID),可以使用这些序号来引用各个进程任务。

$ jobs
[1]+  Running          java -jar /home/QQChat/qq-bot-1.0-SNAPSHOT-execute.jar &
  1. 将前台任务放到后台
# 第一步:使用组合键 Ctrl + Z 将当前任务暂停
[1]+  Stopped                 java -jar /home/QQChat/qq-bot-1.0-SNAPSHOT-execute.jar

# 第二步:执行 bg 命令,当前任务会切换到后台,并从暂定位置继续执行
$ bg 1
[1]+ java -jar /home/QQChat/qq-bot-1.0-SNAPSHOT-execute.jar &
  1. 将后台任务放到前台

后台任务可能有多个,每个任务有不同的标识,可以通过任务序号来指定。

# 执行 bg 命令,传递对应的 Job 的序号:
$ fg 1

**注意:**放到前台运行的任务,使用组合键 Ctrl + C 可以中断。

2.1.3、特点总结

  1. 此方式开启的后台任务,不会被指令 Ctrl + C 指令中断,切结果会输出到终端;
  2. 如果终端断网或者关闭了终端,后台任务会被中断,进程退出;
  3. 此方案更适合配合耗时命令使用,不适合运行后台项目;
  4. 虽然能做到了“后台运行”,但是没有做到真正的后台,即关闭中断也能继续运行;

2.2、方案二:nohup 命令

2.2.1、使用示例

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。(文末有传送带)
在使用上,nohup 命令很简单,只需要放在需要执行的命令之前即可:

# 执行命令
$ nohup java -jar /home/QQChat/qq-bot-1.0-SNAPSHOT-execute.jar

# 运行成功的标志
nohup: ignoring input and appending output to 'nohup.out'

2.2.2、特点总结

  1. 此方案解决了即使终端关闭,进程也能继续运行的问题;
  2. 但不能免疫使用组合键 Ctrl + C 关闭程序;

2.3、终极方案:nohup + &

在真正的项目中,应该使用命令 nohup 结合符号 & 使用,可以同时免疫组合键 Ctrl + C 和 终端关闭(即 Session 结束),能做到让任务永久在 后台运行。

2.3.1、使用示例

# 执行命令
$ nohup java -jar /home/QQChat/qq-bot-1.0-SNAPSHOT-execute.jar &

2.3.2、常用的任务管理命令

  1. jobs :查看任务,返回任务编号n和进程号
  2. bg %n :将编号为n的任务转后台运行
  3. fg %n :将编号为n的任务转前台运行
  4. ctrl+z :挂起当前任务
  5. ctrl+c :结束当前任务

3、参考资料

  1. Linux 中的 &
  2. [阮一峰]Linux 守护进程的启动方法 - 走看看
  3. Linux nohup 命令 | 菜鸟教程
  4. 一分钟了解nohup和&的功效
  5. nohup &的用法、进程查看以及终止 - 声声慢43 - 博客园

更多推荐

Linux 后台运行程序