当前位置: 首页 > Linux

linux后台运行任务nohup组合&用法以及如何准确找到进程并杀死后台任务实践

时间:2023-04-06 20:16:21 Linux

前言nohup为什么要和&一起使用?不过实际生产环境应用场景有限,我就不展开了。这次实际遇到的问题主要是使用crontab调用了多个不同的nohup后台任务。但是代码逻辑中同一个文件的占用导致task进程冲突,导致系统负载高达600,需要killtask。有时候不能盲目操作。需要杀掉的进程很多,并且进程名与其他正常进程名有重叠。需要合理使用pstree才能找到问题的根源。Linux后台运行任务nohup组合&用法及如何准确找到进程并杀死后台任务实践更新历史2019.11.15-阅读原文初稿-https://wsgzao.github.io/post...延伸阅读nohup介绍使用:不挂断运行命令。语法:nohupCommand[Arg...][ &]不管nohup命令的输出是否重定向到终端,输出都会附加到当前目录下的nohup.out文件中。如果当前目录中的nohup.out文件不可写,输出将重定向到$HOME/nohup.out文件。如果无法创建或打开文件进行追加,则不会调用由Command参数指定的命令。退出状态:该命令返回以下退出值:126Command参数指定的命令无法调用但可以找到。127nohup命令遇到错误或找不到Command参数指定的命令。否则nohup命令的退出状态是Command参数指定的命令的退出状态。nohup和&的关系使用nohup运行程序:输出重定向,默认重定向到当前目录下的nohup.out文件使用Ctrl+C发送一个SIGINT信号,程序关闭关闭ShellSession发送一个SIGHUP信号,程序免疫使用&运行程序:program后台运行的结果会输出到终端。使用Ctrl+C发送SIGINT信号。该程序不受关闭Shell会话和发送SIGHUP信号的影响。#最简单的后台运行nohup命令#输出默认重定向到当前目录下的nohup.out文件nohuppythonmain.py&#自定义输出文件(标准输出和错误输出合并到main.log中)nohuppythonmain.py>>main.log2>&1&#简写方法,效果同上例nohuppythonmain.py&>main.log&#不记录输出信息nohuppythonmain.py&>/dev/null&#不记录输出信息,将程序的进程号写入pidfile.txt文件,方便后续查杀进程nohuppythonmain.py&>/dev/null&echo$!>pidfile.txt由于使用了nohup,会自动写入输出如果文件很大,nohup.out会一直增加。我们可以在Linux下使用一个特殊的文件/dev/null来解决这个问题。这个文件相当于一个黑洞。任何输出到该文件的内容都将消失,只保留输出错误消息。nohupcommand>/dev/null2>log&所有信息应该不是nohupcommand>/dev/null2>&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写测试脚本#!/bin/shfor((i=1;i<1000;i++))dod=`date'+%Y-%m-%d%H:%M:%S'`echo"$dprint${i}"sleep2sdone查找已知的pid进程号后台运行的程序当然最好用ps-ef或者ps-aux结合grep来过滤。使用pstree-p确认复杂的进程树结构。使用lsof-i:80检查端口以获取进程号。使用netstat-anp|grep80检查端口以获取进程号。推荐使用lsof杀掉后台运行的程序。killkill命令用于删除正在执行的程序或工作。kill向程序发送指定的信息。默认消息是SIGTERM(15),它终止指定的程序。如果仍然无法杀掉程序,可以使用SIGKILL(9)消息尝试强行删除程序,即kill-9。程序或作业号可以用ps命令或job命令查看。语法kill(option)(parameter)option-a:处理当前进程时,不限制命令名与进程号的对应关系;-l<信息编号>:如果不加<信息编号>选项,-l参数会列出打印出所有信息名称;-p:指定kill命令只打印相关进程的进程号,不发送任何信号;-s<信息名称或编号>:指定要发送的信息;-u:指定用户。参数进程或作业ID:指定要删除的进程或作业。歌词手机内定名:kill-l1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGPIPER24)SIGPIPE15)SIGTERM16)SIGSTKFLT17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU25)SIGXFSZ26)SIGVTALRM27)SIGPROF28)SIGWINCH29)SIGWINCH25)SIG4SIGPW30)SYS34SIGPW30))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只有第九个信号(SIGKILL)可以无条件终止进程,其他信号进程有权忽略。以下是常用的信号:HUP1终端断开INT2中断(同Ctrl+C)QUIT3退出(同Ctrl+\)TERM15TerminateKILL9强行终止CONT18Continue(与STOP相反,fg/bg命令)STOP19暂停(同Ctrl+Z)先用ps找到进程,再用kill杀掉:ps-ef|grepvimroot32682884016:21pts/100:00:00viminstall.logroot33702822016:21pts/000:00:00grepvimkill3268kill3268-bash:kill:(3268)-没有进程killallkillall类似于pill命令,都是使用进程名来杀死进程。使用此命令可终止一组同名进程。我们可以使用kill命令杀死指定进程PID的进程。如果我们要找到我们需要杀掉的进程,我们需要在之前使用ps和grep等命令来寻找进程,而killall将这两个进程合二为一,这是一个非常有用的命令。语法killall(option)(parameter)option-e:精确匹配长名称;-l:忽略大小写差异;-p:杀死进程所属的进程组;-i:交互式杀掉进程,杀掉进程前需要确认;-l:打印所有已知信号的列表;-q:如果没有进程则终止。没有信息输出;-r:使用正则表达式匹配要杀死的进程名称;-s:用指定的进程号替换默认信号“SIGTERM”;-u:杀死指定用户的进程。参数进程名:指定要杀掉的进程名。杀死所有具有相同名称的进程的示例。killallvi使用pstree来查找和终止复杂的进程。3个常见的kill命令。死后台程序:kill-9`catpidfile.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)|)---庆典(139320)---蟒蛇(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'蟒蛇'|grep-vgrep|awk'{print$2}'|xargskill-9参考文章Linux后台运行任务nohup和&3EasyWaystoKillorTerminateaProcessonLinux