Linux后台运行进程的方法与控制

笔记哥 / 04-21 / 13点赞 / 0评论 / 902阅读
## 概念 当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件。对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时间段运行(例如凌晨)。为了使这些进程能够在后台运行,也就是说不在终端屏幕上运行,有几种选择方法可供使用。 ## `&`方法 使用`[shell] &`可以使进程在后台运行,但是用户终端退出时,进程结束,也就是当你连接的终端断开时,你后台运行的服务、命令等自动停止 例如: ```csharp # ping www.baidu.com的返回信息会输出到ping.log日志文件中,最后输出的jobnumber和PID root@master-01:~# ping www.baidu.com &>> ping.log & [1] 1254658 # 查看运行进程 root@master-01:~# jobs [1]+ Running ping www.baidu.com &>> ping.log & root@master-01:~# ps -aux | grep ping root 1254658 0.0 0.0 9048 1344 pts/0 S 19:10 0:00 ping www.baidu.com # 结束job,使用kill %jobid方式杀死job root@master-01:~# kill %1 ``` ## `nohup`方法,推荐使用!!! 使用`&`命令后,作业被提交到后台运行,当前控制台没有被占用,但是当前控制台关闭后,作业就会停止运行。`nohup`命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up / ignoring hangup signals) 即 忽略挂起信号一直在后台执行。 ### 语法: ```csharp nohup Command [ Arg … ] [& ] ``` 示例: ```csharp # 后台运行ping 作业,作业会将信息默认输出到当前目前下的nohup.out文件中 root@master-01:~# nohup ping www.baidu.com & [1] 1266070 root@master-01:~# nohup: ignoring input and appending output to 'nohup.out' # 这里要按一下回车 # 查看作业 root@master-01:~# jobs [1]+ Running nohup ping www.baidu.com & # 查看nohup.out文件 root@master-01:~# ll nohup.out -rw------- 1 root root 1745 Apr 21 19:23 nohup.out # 杀死作业 root@master-01:~# kill %1 # 查看作业是否退出 root@master-01:~# jobs [1]+ Terminated nohup ping www.baidu.com ``` ### nohup将信息输出到指定文件 语法: ```csharp nohup command >> myout.file 2>&1 & ``` 解析: - command>>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是追加输出到out.file文件中。 - 2>&1 是将标准出错 重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个&, 是让该命令在后台执行。 示例: ```csharp # ping命令输出到ping.log日志文件中 root@master-01:~# nohup ping www.baidu.com >> ping.log 2>&1 & [1] 1270295 # 查看ping.log文件 root@master-01:~# tail -f ping.log 64 bytes from 182.61.200.110 (182.61.200.110): icmp_seq=1 ttl=48 time=6.03 ms 64 bytes from 182.61.200.110 (182.61.200.110): icmp_seq=2 ttl=48 time=5.99 ms 64 bytes from 182.61.200.110 (182.61.200.110): icmp_seq=3 ttl=48 time=6.01 ms 64 bytes from 182.61.200.110 (182.61.200.110): icmp_seq=4 ttl=48 time=6.01 ms 64 bytes from 182.61.200.110 (182.61.200.110): icmp_seq=5 ttl=48 time=6.00 ms # 杀掉作业进程 root@master-01:~# jobs [1]+ Running nohup ping www.baidu.com >> ping.log 2>&1 & root@master-01:~# kill %1 root@master-01:~# jobs [1]+ Terminated nohup ping www.baidu.com >> ping.log 2>&1 ``` ## 前后台进程的切换和控制 `CTRL+Z`键盘组合键可以使一个正在前台执行的命令放到后台,并且处于暂停状态 `bg`可以将一个后台运行的命令变成在后台运行,如果后台有多个命令,可以用`bg %jobnumber`将选中的命令调出运行 `fg`可以将后台的命令调至前台继续运行,如果后台有多个命令,可以用`fg %jobnumber`将选中的命令调出 ![image](https://cdn.res.knowhub.vip/c/2504/21/7673016f.png?G1cAAOQ8bZy4F8c26nBtokhoBizSCColrNd77z4N4PudkTU%2bs4%2fl58Nv%2blgOotnMCjByQkUITFQlK5FJoJqTshXTuKcD) ## `screen`方式 Screen是一个全屏窗口管理器,它在多个进程(通常是交互式shell)之间多路传输物理终端。 ### 安装screen ```csharp # centos安装screen yum install -y screen # 在Ubuntu上安装并使用screen sudo apt update -y # 更新包列表 sudo apt install screen -y # 安装screen工具 ``` ### 使用方式 ```csharp # 创建一个新的窗口 screen -S test # 进入窗口后 执行文件 python test.py # 退出当前窗口 ctrl+a+d (方法1:保留当前窗口) screen -d (方法2:保留当前窗口) exit (方法3:退出程序,并关闭窗口) # 查看窗口 screen -ls # 重新连接窗口 screen -r id或窗口名称 ``` 相关快捷键 ```csharp Ctrl+a c :创建窗口 Ctrl+a w :窗口列表 Ctrl+a n :下一个窗口 Ctrl+a p :上一个窗口 Ctrl+a 0-9 :在第0个窗口和第9个窗口之间切换 Ctrl+a K(大写) :关闭当前窗口,并且切换到下一个窗口 (当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态) exit :关闭当前窗口,并且切换到下一个窗口 (当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态) Ctrl+a d :退出当前终端,返回加载screen前的shell命令状态 ```