Linux后台运行进程

  有时候我们需要将一个进程丢到后台运行,甚至需要在我们退出终端后还能继续运行。本文将几种实现方式与区别整理了一下。

nohup

  nohup 的作用是 “使程序运行时不挂起,不向 tty 输出信息” ,比如:

1
nohup ping www.iots.vip  

这样的话,屏幕不会显示 ping 的运行输出,而只是提示 nohup: ignoring input and appending output to ‘nohup.out’ ,这个时候,在当前目录下会生成一个 nohup.out 里面内容即为 ping 的输出内容。我们可以指定输出的文件,如:

1
nohup ping www.iots.vip > ping.mesg  

那么,回到文题,怎样实现将进程丢到后台还能继续运行呢?在上面的例子中也就是让系统在后台一直 ping www.iots.vip,我们可以使用 & 来实现将进程丢到后台:

1
nohup ping www.iots.vip > ping.msg 2>&1 &  

这里实现的是将 ping 的正确输出信息输出至 ping.msg 文件,而屏幕标准输出只输出错误信息,同时将进程丢进后台。
2>&1 解释:

将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文档中。

1
2
3
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)

Ctrl + Z

  Ctrl + Z 与上面的不同,Ctrl + Z 会将当前进程挂起丢入后台,也就是暂停至后台,不会继续运行。挂起的进程通过 jobs 可以看到:

1
2
3
ping www.iots.vip  # 按下 Ctrl + Z  
^Z
[1]+ Stopped ping www.iots.vip

执行 jobs 可以看到:

1
2
jobs  
[1]+ Stopped ping www.iots.vip

使用 bg %任务号 可以在激活挂起的任务让其在后台运行:

1
bg %1

这里将会不停的输出 ping 的回复,必须要退出终端才能终止,在所运行的程序有标准输出的时候不推荐这样使用。
使用 fg %任务号 可以在激活挂起的任务让其在前台运行。

后记

值得注意的是,Ctrl + Z 后使用 bg 激活的后台运行进程以及使用 nohup & 在后台运行的进程,在重登终端的时候 jobs 均不会显示,只能通过 ps -ef 看到,要停止运行也只能使用 kill 来停止。

补充:

screen

2019年8月13日
感谢 @Bill 补充,screen 也是一个很棒的工具,不过需要单独安装:

1
sudo yum install screen  

  通过执行 screen 来新建一个会话,使用 Ctrl + A,D 离开该会话,会话将在后台继续运行,之后 screen -ls 可以查看会话列表。 使用 screen -r pid或tty或host 恢复会话,使用 exit 可以退出会话,会话不会再运行。
  screen 相比上面的方式更加方便,能做的事情也更多,

常用screen参数

1
2
3
4
5
screen -S yourname # 新建一个叫 yourname 的 session
screen -ls # 列出当前所有的 session
screen -r yourname # 回到 yourname 这个 session
screen -d yourname # 远程 detach 某个 session
screen -d -r yourname # 结束当前 session 并回到 yourname 这个session
常用快捷键
1
2
3
4
5
6
7
8
9
10
11
Ctrl + a d   暂时离开screen会话,此时在screen session里,每个window内运行的process(无论是前台/后台)都在继续执行,即使logout也不影响。
Ctrl + a ? 显示所有键绑定信息
Ctrl + a w 显示所有窗口列表
Ctrl + a C-a 切换到之前显示的窗口
Ctrl + a c 创建一个新的运行shell的窗口并切换到该窗口
Ctrl + a n 切换到下一个窗口
Ctrl + a p 切换到前一个窗口(与C-a n相对)
Ctrl + a 0..9 切换到窗口0..9
Ctrl + a a 发送 C-a到当前窗口
Ctrl + a k 杀掉当前窗口
Ctrl + a [ 进入拷贝/回滚模式

tmux

2022年5月 近期开始使用 tmux 这个 screen 加强版,有兴趣的同学可以尝试一下。