Linux如何让进程在后台运行的三种方法详解

发布时间 - 2017-06-07 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.pythontab.com &
[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.pythontab.com
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.pythontab.com
[root@pythontab ~]# ps -ef |grep www.pythontab.com
root     31094     1  0 07:28 ?        00:00:00 ping www.pythontab.com
root     31102 29217  0 07:29 pts/4    00:00:00 grep www.pythontab.com
[root@pythontab ~]#

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

3。& subshell

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

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

subshell 示例

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

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

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


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


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


相关推荐: 阿里云网站搭建费用解析:服务器价格与建站成本优化指南  手机软键盘弹出时影响布局的解决方法  🚀拖拽式CMS建站能否实现高效与个性化并存?  C#如何调用原生C++ COM对象详解  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  jQuery中的100个技巧汇总  创业网站制作流程,创业网站可靠吗?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  MySQL查询结果复制到新表的方法(更新、插入)  千库网官网入口推荐 千库网设计创意平台入口  网站制作壁纸教程视频,电脑壁纸网站?  如何在阿里云香港服务器快速搭建网站?  Laravel怎么使用artisan命令缓存配置和视图  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  米侠浏览器网页背景异常怎么办 米侠显示修复  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  node.js报错:Cannot find module 'ejs'的解决办法  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  海南网站制作公司有哪些,海口网是哪家的?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel如何自定义分页视图?(Pagination示例)  高端企业智能建站程序:SEO优化与响应式模板定制开发  网站建设整体流程解析,建站其实很容易!  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  西安专业网站制作公司有哪些,陕西省建行官方网站?  长沙做网站要多少钱,长沙国安网络怎么样?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  详解阿里云nginx服务器多站点的配置  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  如何在搬瓦工VPS快速搭建网站?  如何快速搭建高效WAP手机网站?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  高防服务器:AI智能防御DDoS攻击与数据安全保障  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何用IIS7快速搭建并优化网站站点?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在Ubuntu系统下快速搭建WordPress个人网站?