有时候我们需要将一个进程丢到后台运行,甚至需要在我们退出终端后还能继续运行。本文将几种实现方式与区别整理了一下。
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
30 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
Ctrl + Z
Ctrl + Z 与上面的不同,Ctrl + Z 会将当前进程挂起丢入后台,也就是暂停至后台,不会继续运行。挂起的进程通过 jobs
可以看到:1
2
3ping www.iots.vip # 按下 Ctrl + Z
^Z
[1]+ Stopped ping www.iots.vip
执行 jobs
可以看到:1
2jobs
[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 | screen -S yourname # 新建一个叫 yourname 的 session |
常用快捷键
1 | Ctrl + a d 暂时离开screen会话,此时在screen session里,每个window内运行的process(无论是前台/后台)都在继续执行,即使logout也不影响。 |
tmux
2022年5月 近期开始使用 tmux 这个 screen 加强版,有兴趣的同学可以尝试一下。