Linux下系统后台运行的方法讲解

发布时间 - 2017-08-22 00:00:00    点击率:

我们经常会碰到这样的问题,想要在linux 服务器运行一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?

下面列举了三种方法,可以很方便的满足上述需求。

问题分析:

我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

三种解决办法:

1. nohup

nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。

nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。

nohup 示例

[root@pythontab ~]# nohup ping www. &
[1] 3059
nohup: appending output to `nohup.out'
[root@pythontab ~]# ps -ef |grep 3059
root      3059   984  0 15:06 pts/3    00:00:00 ping www.
root      3067   984  0 15:06 pts/3    00:00:00 grep 3059
[root@pythontab ~]#

2。setsid

nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。

setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。

setsid 示例

[root@pythontab ~]# setsid ping www.
[root@pythontab ~]# ps -ef |grep www.
root     31094     1  0 07:28 ?        00:00:00 ping www.
root     31102 29217  0 07:29 pts/4    00:00:00 grep www.
[root@pythontab ~]#

值得注意的是,上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。

3。& subshell

这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。

当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。

subshell 示例

[root@pythontab ~]# (ping www. &)
[root@pythontab ~]# ps -ef |grep www.
root     16270     1  0 16:13 pts/4    00:00:00 ping www.
root     16278 15362  0 16:13 pts/4    00:00:00 grep www.
[root@pythontab ~]#

从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。

比较而言,我更喜欢用setsid,简单实用。当然,这里看大家喜好即可,效果上差别不大。


# linux  # 就能  # 也就  # 只需  # 三种  # 解决办法  # 中途  # 的是  # 重定向  # 就会  # 让我们 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel怎么调用外部API_Laravel Http Client客户端使用  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何在IIS7中新建站点?详细步骤解析  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何在阿里云域名上完成建站全流程?  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Android自定义控件实现温度旋转按钮效果  如何撰写建站申请书?关键要点有哪些?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  米侠浏览器网页背景异常怎么办 米侠显示修复  googleplay官方入口在哪里_Google Play官方商店快速入口指南  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Java遍历集合的三种方式  微信小程序 scroll-view组件实现列表页实例代码  如何用景安虚拟主机手机版绑定域名建站?  网站建设保证美观性,需要考虑的几点问题!  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  个人网站制作流程图片大全,个人网站如何注销?  如何在阿里云服务器自主搭建网站?  Laravel storage目录权限问题_Laravel文件写入权限设置  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Python文本处理实践_日志清洗解析【指导】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  香港服务器如何优化才能显著提升网站加载速度?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何在宝塔面板中修改默认建站目录?  如何在 Pandas 中基于一列条件计算另一列的分组均值  iOS正则表达式验证手机号、邮箱、身份证号等  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何挑选优质建站一级代理提升网站排名?  如何快速搭建支持数据库操作的智能建站平台?