点击上方“咸鱼学Python”,选择“加为星标”

第一时间关注Python技术干货!

作者:wsgao

原文:https://wsgzao.github.io/post/nohup/

前言

nohup 为什么要跟着 & 一起使用,不知道大家有没有思考过其中的小区别?

另外很多人会推崇使用 screen,但是实际生产环境应用场景有限我就不展开了。

这次实际遇到的问题主要是因为使用 crontab 调用了多个不同的 nohup 后台执行任务,然而代码逻辑中出现对相同文件的占用导致任务进程产生冲突使得 system load 负载达到 600 之高,需要 kill 任务时也不能盲目操作,需要杀掉的进程多且进程名与其它正常的进程名字有交集,需要合理运用 pstree 找到问题的源头。

Linux 后台运行任务 nohup 结合 & 用法以及如何精准查找进程并 kill 后台任务实践

nohup 介绍

用途:不挂断地运行命令。

语法:nohup Command [Arg …] [ & ]

•无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。•如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。•如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。退出状态:该命令返回下列出口值:•126 可以查找但不能调用 Command 参数指定的命令。•127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。否则 nohup 命令的退出状态是 Command 参数指定命令的退出状态。

nohup 和 & 的关系

使用 nohup 运行程序:

•输出重定向,默认重定向到当前目录下 nohup.out 文件•使用 Ctrl + C 发送 SIGINT 信号,程序关闭•关闭 Shell Session 发送 SIGHUP 信号,程序免疫

使用 & 运行程序:

•程序转入后台运行•结果会输出到终端•使用 Ctrl + C 发送 SIGINT 信号,程序免疫•关闭 Shell session 发送 SIGHUP 信号,程序关闭

nohup 和 & 使用实例

一般两个一起组合使用不会受 Ctrl C 和 Shell 关闭的影响:

# 最简单的后台运行nohup command 输出默认重定向到当前目录下 nohup.out 文件nohup python main.py 自定义输出文件 (标准输出和错误输出合并到 main.log)nohup python main.py>>main.log2>&1 与上一个例子相同作用的简写方法nohup python main.py&>main.log 不记录输出信息nohup python main.py&>/dev/null 不记录输出信息并将程序的进程号写入 pidfile.txt 文件中,方便后续杀死进程nohup python main.py&>/dev/null&echo $!>pidfile.txt

由于使用 nohup 时,会自动将输出写入 nohup.out 文件中,如果文件很大的话,nohup.out 就会不停的增大,我们可以利用 Linux 下一个特殊的文件 /dev/null 来解决这个问题,这个文件就相当于一个黑洞,任何输出到这个文件的东西都将消失 只保留输出错误信息 nohup command >/dev/null 2>log & 所有信息都不要 nohup command >/dev/null 2>&1 &

这里解释一下后面的 2>&1 。

这涉及到 Linux 的重定向,其中 0、1、2 分别是标准输入、标准输出、标准错误输出,用来指定需要重定向的标准输入输出。默认情况下是标出输出,也就是 1 。

例如我们而上文提到的 2>&1 是 将错误信息重定向到标准输出。

还有就是如果不想让程序输出,Linux 下有一个 /dev/null 的特殊文件,就像一个黑洞,所有输出到这个文件的信息全部会消失,如果你不需要输出日志,这样做就不会导致输出日志文件越来越大,占用存储空间的问题了

其他相关命令

命令演示:

# 结束当前任务ctrl+c# 将一个正在前台执行的命令放到后台,并且处于暂停状态ctrl+z# 查看任务,返回任务编号 和 进程号jobs-l# 将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用 bg %jobnumber 将选中的命令调出。bg%jobnumber# 将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber(是命令编号,不是进程号)将选中的命令调出fg%jobnumber

查找后台运行程序

1.已知 pid 进程号当然最好了2.使用 ps -ef 或者 ps -aux 结合 grep 过滤3.使用 pstree -p 确认复杂进程树结构4.使用 lsof -i:80 查端口获得进程号5.使用 netstat -anp | grep 80 查端口获得进程号,推荐使用 lsof

杀死后台运行程序

kill

kill 命令用来删除执行中的程序或工作。kill 可将指定的信息送至程序。预设的信息为 SIGTERM (15), 可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL (9) 信息尝试强制删除程序,即 kill -9。程序或工作的编号可利用 ps 指令或 job 指令查看。

语法

kill(选项) (参数)

选项

-a:当处理当前进程时,不限制命令名和进程号的对应关系;-l

参数

进程或作业识别号:指定要删除的进程或作业。

实例

列出所有信号名称:

kill-l1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM16)SIGSTKFLT17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU25)SIGXFSZ26)SIGVTALRM27)SIGPROF28)SIGWINCH29)SIGIO30)SIGPWR31)SIGSYS34)SIGRTMIN35)SIGRTMIN+136)SIGRTMIN+237)SIGRTMIN+338)SIGRTMIN+439)SIGRTMIN+540)SIGRTMIN+641)SIGRTMIN+742)SIGRTMIN+843)SIGRTMIN+944)SIGRTMIN+1045)SIGRTMIN+1146)SIGRTMIN+1247)SIGRTMIN+1348)SIGRTMIN+1449)SIGRTMIN+1550)SIGRTMAX-1451)SIGRTMAX-1352)SIGRTMAX-1253)SIGRTMAX-1154)SIGRTMAX-1055)SIGRTMAX-956)SIGRTMAX-857)SIGRTMAX-758)SIGRTMAX-659)SIGRTMAX-560)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-263)SIGRTMAX-164)SIGRTMAX

只有第 9 种信号 (SIGKILL) 才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:

HUP1终端断线INT2中断(同Ctrl+C)QUIT3退出(同Ctrl+\)TERM15终止KILL9强制终止CONT18继续(与STOP相反,fg/bg命令)STOP19暂停(同Ctrl+Z)

先用 ps 查找进程,然后用 kill 杀掉:

ps-ef|grep vimroot32682884016:21pts/100:00:00vim install.logroot33702822016:21pts/000:00:00grep vimkill3268kill3268-bash:kill:(3268)-没有那个进程

killall

killall 和 kill 命令差不多都是使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。

我们可以使用 kill 命令杀死指定进程 PID 的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用 ps 等命令再配合 grep 来查找进程,而 killall 把这两个过程合二为一,是一个很好用的命令。

语法

killall(选项) (参数)

选项

-e:对长名称进行精确匹配;-l:忽略大小写的不同;-p:杀死进程所属的进程组;-i:交互式杀死进程,杀死进程前需要进行确认;-l:打印所有已知信号列表;-q:如果没有进程被杀死。则不输出任何信息;-r:使用正规表达式匹配要杀死的进程名称;-s:用指定的进程号代替默认信号“SIGTERM”;-u:杀死指定用户的进程。

参数

进程名称:指定要杀死的进程名称。

实例

杀死所有同名进程

killall vi

使用 pstree 查找和杀死复杂进程

常见的 3 个 kill 命令

killpkillkillall

搭配查找进程命令

pidofpstree

实例

# 已知进程号,启动时输出后台运行程序的进程号,然后读取进程号杀死后台程序:kill-9`cat pidfile.txt`# 进程数量较多且有规律,不和其他正常进程冲突killall进程名kill-9$(pidof进程名)# 进程数量多,规律不明显,混了正常进程pstree-p# 复杂点的情况比如像我遇到的真实案例|-crond(127436)-+-crond(138887)---bash(138892)---bash(138895)---grep(140604)||-crond(139310)---bash(139323)---bash(139324)---python(139431)||-crond(139311)---bash(139325)---bash(139331)---python(139452)||-crond(139312)---bash(139318)---bash(139319)---python(139442)||-crond(139313)---bash(139317)---bash(139320)---python(139444)||-crond(139314)---bash(139329)---bash(139340)---python(139443)||-crond(139315)---bash(139327)---bash(139339)---grep(140768)||-crond(139651)---bash(139660)---bash(139661)---python(139915)||-crond(139652)---bash(139664)---bash(139666)---python(139916)||-crond(139653)---bash(139663)---bash(139665)---python(139914)||-crond(139654)---bash(139675)---bash(139683)---python(139918)||-crond(139655)---bash(139668)---bash(139677)---python(139913)|`-crond(139656)---bash(139669)---bash(139682)---grep(139780)# 如果你喜欢用 grep 也没有问题,多设置几个过滤条件语句组合在一起即可ps-ef|grep'python'|grep-v grep|awk'{print $2}'|xargs kill-9

参考文章

Linux-后台运行任务-nohup-和&[1]

3 Easy Ways to Kill or Terminate a Process on Linux[2]

References

[1] Linux-后台运行任务-nohup-和&: https://woodenrobot.me/2019/07/04/Linux-%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E4%BB%BB%E5%8A%A1-nohup-%E5%92%8C/

[2] 3 Easy Ways to Kill or Terminate a Process on Linux: https://www.2daygeek.com/kill-terminate-a-process-in-linux-using-kill-pkill-killall-command/

喜欢文章,点个在看

python多进程 保活_老板,你这个爬虫保活吗?相关推荐

  1. python多进程优化_『Python』多进程处理

    尝试学习python的多进程模组,对比多线程,大概的区别在: 1.多进程的处理速度更快 2.多进程的各个子进程之间交换数据很不方便 多进程调用方式 进程基本使用multicore() 进程池优化进程的 ...

  2. python多进程打印输出_多进程打印日志

    多进程的日志和多线程的日志有一点区别.原因是 Python 的 logging 包不支持进程共享锁,所以来自不同的进程的日志可能会混在一起.我们尝试一下在上边的例子里加一个基础日志.下边是代码:imp ...

  3. python多进程优化_如何利用多进程优化Python视频应用

    如果要用Python播放视频,或者打开摄像头获取视频流,我们可以用OpenCV Python.但是在视频帧获取的时候同时做一些图像识别和处理,可能会因为耗时多而导致卡顿.一般来说,我们首先会想到把这些 ...

  4. python自动数据分析_老板让我从几百个Excel中查找数据,我用python一分钟搞定!...

    相信大家最近都快被python烦死了,朋友圈,公众号推文,小视频上都是关于python的广告,什么面试录取会用python的人,刚来的同事因为会用python升职加薪啦等等.但是小编觉得,python ...

  5. python多进程调试_使用pyrasite进行python进程调试,改变运行中进程的代码

    后端开发中有时会遇到这种情况:进程运行中偶现,重启进程问题就消失:或者是,进程一定要运行一段时间才会出现问题:又或是,极难复现的问题出现了,然而已有的log不足以定位 对于这些情况,尽管大部分时候,我 ...

  6. python多进程编程_【玩树莓】编程篇(八)Python多线程、多进程编程

    1.多任务编程 除了计算性能和图形显示以外,树莓派区别于Arduino的一大特点就是运行多任务操作系统.通过多任务系统用户可以同时执行多个互相独立的程序(任务),来完成不同的操作. 利用Python的 ...

  7. 以爬取知乎为例,进行python 多进程爬虫性能分析

    以爬取知乎为例,进行python 多进程爬虫性能分析 如果对多进程multiproessing模块不熟悉,请先浏览 python 使用multiprocessing模块进行多进程爬虫 问题背景: 爬取 ...

  8. python 多进程_说说Python多线程与多进程的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  9. python scrapy框架基如何实现多线程_【转】爬虫的一般方法、异步、并发与框架scrapy的效率比较...

    问题的由来 我们的需求为爬取红色框框内的名人(有500条记录,图片只展示了一部分)的 名字以及其介绍,关于其介绍,点击该名人的名字即可,如下图: 这就意味着我们需要爬取500个这样的页面,即500个H ...

最新文章

  1. 如何让一种币更有生命力——一种BCH开发资金募集方案大讨论
  2. Android Gradle 配置Java src目录、Res 目录
  3. php+ tinymce粘贴word
  4. textarea 高度调整
  5. android 高清壁纸设置慢
  6. 苹果6屏幕多大_苹果12使用高通X55,10亿买下的英特尔基带何时能派上用场
  7. python3.7模块内容_python3.7 time模块
  8. php bc gmp,php中ipv6转纯数字和反转
  9. [转]献给2010年仍然单身的80后
  10. 笔记本设置wifi热点
  11. java constants无法使用_轻松看懂Java字节码
  12. java简单的学生管理系统界面_java 学生信息管理系统(图形界面)
  13. 惠普p1106打印机安装步骤_hp打印机P1106安装不了驱动,总是失败,如下图
  14. QGIS 影像图黑色背景去除
  15. java 视频边下边播_video src,如何边加载边播放?
  16. 牛客输入输出(依图科技)
  17. 快手如何通过算法和算力支撑用户的增长
  18. 学习淘淘商城第十六课(展示后台管理页面)
  19. HUAWEI P20系列国内发布 徕卡三摄+AI开启智慧摄影新时代
  20. GUVC-S10GD 紫外光传感器 韩国GENICOM光电光传感器纯UV-C监控

热门文章

  1. Windows server 2003 Cpu的-性能报警
  2. 安装Visual Studio 2005 SP1时遇到1718错误
  3. Filebeat 收集日志的那些事儿
  4. Go实现Raft第一篇:介绍
  5. 以行为单位对字符串变量下标为奇数位置上的字符按其ASCii值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中
  6. 线条边框简笔画图片大全_简笔画猪 手抄报图片边框版式大全
  7. 重构-改善既有代码的设计 (该书写于1999)培训之一
  8. unserialize用法
  9. Spring中的Aop底层原理
  10. Go 的 Contex 是线程安全的吗?