Linux命令之nohup详解

nohup

  • 什么是nohup

    nohup 全称:no hang up(不挂起)。也就是说,当前交互命令行退出的时候,程序还在运行。

  • 语法

    nohup Command [Arg...] [ &]
    最后的" &":表示后台运行,不霸占交互命令行
    如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。
    如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
    如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
    如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
    
    nohup命令提交作业时,指定输出文件:
    
    nohup command > myout.file 2>&1 &
    
    0 – stdin (standard input,标准输入) 
    1 – stdout (standard output,标准输出)
    2 – stderr (standard error,标准错误输出) 
    2>&1解释:
    将标准错误(2)重定向到标准输出(&1),
    标准输出(&1)再被重定向输入到myout.file文件中。
    
    如:./startup.sh 2>&1 | tee startup.log
    表示将执行startup.sh脚本后到标准输出和标准错误输出内容写入到startup.log文件中。tee 默认是覆盖的方式写入文件中,加-a表示追加。
    
    最终解释:表示命令执行后退出交互命令行也不挂起,通过最后一个 &,表示后台运行,不霸占交互命令行,同时将标准输出和标准错误输出合并到myout.file文件中。
    复制代码
  • 怎么关闭此进程

    ps -ef |grep 关键字  |awk '{print $2}'|xargs kill -9
    
    |grep 关键字:通过关键字过滤
    |awk 'print $2' :以默认分隔符(空格)分割每行的列,只输入每行第二列的内容,即进程ID
    |xargs:将所有行数据转为单行,并以空格分开,然后作为kill的参数
    kill -9:彻底杀死进程,进程参数为|xargs拼接的。
    
    举例:
    1、使用命令:"ps -ef" 获取所有进程
    2、通过管道结合grep命令实现关键字过滤,如获取包含关键字"goole"进程:
    命令:ps -ef |grep google
    结果:
        501   370     1   0 五09下午 ??         0:00.13 /Applications/Google Chrome.app/Contents/Versions/73.0.3683.103/Google Chrome Framework.framework/Helpers/crashpad_handler --monitor-self-annotation=ptype=crashpad-handler --database=/Users/hejunbin/Library/Application Support/Google/Chrome/Crashpad --metrics-dir=/Users/hejunbin/Library/Application Support/Google/Chrome --url=https://clients2.google.com/cr/report --annotation=channel= --annotation=plat=OS X --annotation=prod=Chrome_Mac --annotation=ver=73.0.3683.103 --handshake-fd=8
        501 28410 28409   0 10:39下午 ??         0:04.32 /Users/hejunbin/Library/Android/sdk/emulator/emulator64-crash-service -pipe com.google.AndroidEmulator.CrashService.28409 -ppid 28409 -data-dir /tmp/android-hejunbin/c40cfa4e-4abb-4b7a-8790-77cbdfd5ddb0
        501 35764 34208   0  1:34下午 ttys005    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn google
    3、通过管道加awk命令只显示进程的ID:
    命令:ps -ef |grep google |awk '{print $2}'
    结果:
        370
        28410
        35798
    4、通过管道加xargs命令将这些进程ID转为ps的进程ID集。
    命令:ps -ef |grep google |awk '{print $2}' |xargs
    结果:370 28410 35900
    5、利用xargs命令调用ps命令,彻底杀死指定的进程
    命令:ps -ef |grep google |awk '{print $2}' |xargs ps -9
    复制代码
  • ps命令:列出进程

    参数如下:
    -e 显示所有进程。
    -f 全格式。
    -h 不显示标题。
    -l 长格式。
    -w 宽输出。
    复制代码
  • awk命令:文本处理工具

    awk支持对记录和字段的处理,其中对字段的处理是grep和sed不能实现的,这也是awk优于二者的原因之一。
    在awk中,缺省的情况下总是将文本文件中的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。
    为了操作这些不同的字段,awk借用shell的方法,用1,2,3...这样的方式来顺序地表示行(记录)中的不同字段。
    特殊地,awk用0表示整个行(记录)。
    
    不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。
    awk允许在命令行中用-F re的形式来改变这个分隔符。
    
    事实上,awk用一个内置的变量RS来记忆这个分隔符。
    awk中有好几个这样的内置变量,例如:
        记录分隔符变量RS
        当前工作的记录数NR
    
    这些内置的变量可以在awk程序中引用或修改,例如,你可以利用NR变量在模式匹配中指定工作范围,也可以通过修改记录分隔符RS让一个特殊字符而不是换行符作为记录的分隔符。
    
    例:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:
    awk -F % 'NR>=7,NR<=15 {print $1 $3 $7}' myfile
    
    awk提供了有很多内置变量,其中ARG相关变量是文本处理中比较常用的。
    ARGC:命令行参数个数(不包括awk的选项和awk的程序内容)。
    ARGIND:当前正在处理的ARGV中的文件的索引值(同时处理多个文件时会用到)。
    ARGV:命令行参数序列数组,下标从0开始。
    复制代码
  • xargs命令:xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

    xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
    
    xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
    
    xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
    
    xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
    
    之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
    
    find /sbin -perm +700 |ls -l       #这个命令是错误的
    find /sbin -perm +700 |xargs ls -l   #这样才是正确的
    xargs 一般是和管道一起使用。
    
    命令格式:
    
    somecommand |xargs -item  command
    参数:
    
    -a file 从文件中读入作为sdtin
    -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
    -p 当每次执行一个argument的时候询问一次用户。
    -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
    -t 表示先打印命令,然后再执行。
    -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
    -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
    -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
    -L num 从标准输入一次读取 num 行送给 command 命令。
    -l 同 -L。
    -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
    -x exit的意思,主要是配合-s使用。。
    -P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
    复制代码
  • kill命令:杀掉进程

    kill [-s signal_name] pid ...
    kill -l [exit_status]
    kill -signal_name pid ...
    kill -signal_number pid ...
    
    signal_number 常用参数:
    Some of the more commonly used signals:
    
    1       HUP (hang up)
    2       INT (interrupt)
    3       QUIT (quit)
    6       ABRT (abort)
    9       KILL (non-catchable, non-ignorable kill) 彻底杀死进程
    14      ALRM (alarm clock)
    15      TERM (software termination signal)
    
    实例:kill -9 123456  (彻底杀死进程ID为123456的进程)
    复制代码

参考文档

www.runoob.com/linux/linux…

转载于:https://juejin.im/post/5cf71ed96fb9a07ebf4b5ccf

猜你喜欢

转载自blog.csdn.net/weixin_33805557/article/details/91417889