首页 > 其他分享 >nohup介绍

nohup介绍

时间:2024-08-22 15:05:48浏览次数:11  
标签:python 介绍 --- kill nohup 进程 bash

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.log 2>&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
编写一个测试脚本
#!/bin/sh
for ((i=1; i<1000; i++))
do
    d=`date '+%Y-%m-%d %H:%M:%S'`
    echo "$d print ${i}"
    sleep 2s
done

查找后台运行程序

  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 <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
-s <信息名称或编号>:指定要送出的信息;
-u:指定用户。

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

实例 列出所有信号名称:

kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

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

HUP     1    终端断线
INT     2    中断(同 Ctrl + C)
QUIT    3    退出(同 Ctrl + \)
TERM   15    终止
KILL    9    强制终止
CONT   18    继续(与STOP相反, fg/bg命令)
STOP   19    暂停(同 Ctrl + Z)

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

ps -ef | grep vim
root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log
root      3370  2822  0 16:21 pts/0    00:00:00 grep vim

kill 3268
kill 3268
-bash: kill: (3268) - 没有那个进程

killall

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

语法 killall(选项)(参数)

选项

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

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

实例 杀死所有同名进程

killall vi

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

常见的3个kill命令 - kill - pkill - killall

搭配查找进程命令 - pidof - pstree

# 已知进程号,启动时输出后台运行程序的进程号,然后读取进程号杀死后台程序:
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

标签:python,介绍,---,kill,nohup,进程,bash
From: https://www.cnblogs.com/forestwolf/p/18373905

相关文章

  • Go语言基础--函数基本介绍及包
    Go语言(也称为Golang)的函数是执行特定任务的代码块。它们允许你重用代码,让程序更加模块化和易于维护。在Go中,函数可以接收参数(输入值)并返回结果(输出值)。下面详细解释Go语言中的函数:函数定义函数通过 func 关键字定义。基本结构如下:funcfunctionName(parameterList)......
  • 智能控制打气泵方案pcba的介绍说明
    在日常生活中,无论是汽车轮胎、自行车轮胎,还是各种球类等,保持合适的气压至关重要。这款车载打气泵方案不仅具备高精度控制和测量的特点还采用了高集成芯片设计。以下是一篇围绕打气泵PCBA(PrintedCircuitBoardAssembly,印刷电路板组件)的功能介绍、运行原理和应用场景:一、......
  • JAVA 的介绍和安装
    JAVA的介绍和安装Java的三大版本JavaSE:标准版(桌面程序,控制器开发)JavaME:嵌入式开发(忽略)JavaEE:E企业级开发(web端,服务器开发……)学习思路SE→EEJava的组成JDK、JRE、JVMJDK:javadevelopmentkit(java开发者工具)JRE:JavaruntimeenvironmentJVM:javavirtu......
  • 浅谈面向对象三大特性(着重介绍虚函数实现的多态)
        写在前面:文章内容分享为主,如有不当之处,恳请批评指正。        今天在使用C++的工厂模式的时候,突然发下有些生疏,就想着发一篇博客,巩固一下,但突然想到工厂模式中设计的继承以及多态的特性,决定先发一篇有关于C++多态的文章,其他的就丢给明天吧!一、面向对象三......
  • 第一章 redis简单介绍
    一、引言在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技......
  • 本章主要介绍西门子V90伺服驱动系统的接线说明(电机抱闸)
    1、V90PTI400V高惯量电机抱闸接线对于400V系列伺服驱动,电机抱闸接口(X7)集成在前面板。将其与带抱闸的伺服电机连接即可使用电机抱闸功能。2、V90PTI200V低惯量电机抱闸接线对于200V系列伺服驱动,没有集成单独的电机抱闸接口。为使用抱闸功能,需要通过控制/状态接......
  • 操作系统线程介绍
    线程介绍什么是线程:线程是操作系统能内够进行运算、执行的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。总结:线程是进程的一部分,是进程内负责执行的单位,进程是由资......
  • Java小白一文深入介绍String、StringBuffer、StringBuilder
    String类String对象用于保存字符串,也就是一组字符序列字符串常量对象是用双引号括起的字符序列,例如“Kerwin”字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节String类较常用构造方法Strings1=newString();Strings2=newString(Str......
  • Aloha-便携式 AI 实验室 开箱介绍
    原文链接:Aloha-AILabIn ABox(youtube.com) AlohakitsarecompleteRoboticMachineLearningLabs.Theyhaveeverythingyouneedtogetupandrunninginlessthanaday;Hardware,Software,MachineLearningModels,CustomerSupport,Warranty,aprel......
  • SAP B1 三大基本表单标准功能介绍-业务伙伴主数据(三)
    背景在SAPB1中,科目表、业务伙伴主数据、物料主数据被称为三大基本表单,其中的标准功能是实施项目的基础。本系列文章将逐一介绍三大基本表单各个字段的含义、须填内容、功能等内容。附上SAPB110.0的帮助文档:SAPBusinessOne10.0|SAPHelpPortal本文介绍的是:业务......