一、几个基本符号及其含义

之前看到别人写的一个shell脚本,有一个命令是:rm -f ${src_tmp_file} > /dev/null 2>&1

现在大概明白是什么意思了

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用

类型 文件描述符 默认情况 对应文件句柄位置
标准输入(standard input) 0 从键盘获得输入 /proc/self/fd/0
标准输出(standard output) 1 输出到屏幕(即控制台) /proc/self/fd/1
错误输出(error output) 2 输出到屏幕(即控制台) /proc/self/fd/2
  • /dev/null 表示空设备文件
  • 0 表示stdin标准输入
  • 1 表示stdout标准输出
  • 2 表示stderr标准错误

>/dev/null

这条命令的作用是将标准输出1重定向到/dev/null中。 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。

&1

对于 &1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。

2

对于2 ,表示标准错误,stderr。

2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null

rm -f ${src_tmp_file} > /dev/null 2>&1 其实等于 rm -f ${src_tmp_file} 1 > /dev/null 2>&1

rm -f ${src_tmp_file} 1 > /dev/null 2>&1,可以看成三部分:
1.命令:rm -f ${src_tmp_file}
2. 1 > /dev/null:把这条删除命令的标准输出重定向到/dev/null(即不会显示)
3. 2>&1:把错误输出重定向到标准输出,而上面把标准输出重定向到/dev/null,即错误输出也重定向到/dev/null
4. 因此这条命令无论正确执行还是错误,都不会有任何显示

二、测试

ls 2 > a.txt:不会报没有2文件的错误,但会输出一个空的文件a.txt;

ls xxx 2 > a.txt:会报错,没有xxx这个文件,但是错误信息输出到了文件a.txt中,不会显示在终端;

ls xxx 2 > &1:错误跑到标准输出了;

ls xxx > out.txt 2 > &1:等于 ls xxx 1 > out.txt 2 > &1;正确或者错误的信息都写到out.txt,不会显示在终端。

三、如何在后台启动进程

1、进程的启动方式

1.前台启动:用户输入命令,直接执行程序
2.后台启动:在命令行尾加入"&"符号,例如后台启动weblogic服务:nohup ./startWeblogic.sh &

2、后台不挂断运行进程

要想在后台不挂断运行进程,即使把终端关闭了也能继续运行的进程,单单使用"&"是不行的,
因为"&"只能让进程在后台启动,如果关闭终端,这个进程还是会结束的,因此需要配合"nohup"命令使用

命令使用
nohup command > /dev/null 2>&1 &

# 解释
nohup:
no hangup,不挂断地运行命令。只用nohup命令,关闭终端,进程还存在。若在终端中直接使用Ctrl+c,则会关闭进程。
若没有指定标准输出和标准错误,那么所有输出都被重定向到一个名为nohup.out的文件中(比如:nohup command & )

在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。

那么如果我们需要某个命令长时间运行,什么方法能最简便的保证它在后台稳定运行呢?
我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。
因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。   1. nohup
nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。 2.setsid
nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。 在linux下,一个session是由一组进程组构成的,每个进程组又由多个进程构成。 # session创建
session可以在任何时候创建,调用setsid函数即可,session中的第一个进程即为这个session的leader,leader是不能变的。常见的创建session的场景是:
用户登录后,启动bash进程时将会创建新的session,bash进程会作为session的leader,随后bash里面运行的进程(不特殊处理)都将属于这个session。 # 特点
session的主要特点是当session的leader退出后,session中的所有其它进程将会收到SIGHUP信号,其默认行为是终止进程,即session的leader退出后,session中的其它进程也会退出。
如果session和tty关联的话,它们之间只能一一对应,一个tty只能属于一个session,一个session只能打开一个tty。当然session也可以不和任何tty关联。 # 使用
只需要在命令使用前加上setsid就可以了,该方法的作用是新建一个新的session,使用户进程和bash不在同一个session,并使自己成为leader。

hangup名称的来由

command:
command是用户输入的命令,可自行设置。如“java -jar crm.jar”等。

&:
后台运行。当你只使用“&”时,关闭终端,进程会关闭。

建议:
所以当你要让程序在后台不挂断运行时,需要将nohup和&一起使用。

例如:nohup ./startWeblogic.sh > /dev/null 2>&1 &

3、tips

jobs:
使用"jobs"可查看当前有多少在后台运行的命令。

fg:
将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用"fg %jobnumber"(是jobs编号,不是进程号)将选中的命令调出。

bg:
将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用"bg %jobnumber"将选中的命令调出。

kill %jobnumber: 终止后台进程。

linux下 > /dev/null 2 > &1 的意思和如何在后台启动进程的更多相关文章

  1. Linux下">/dev/null 2>&1 "相关知识说明

    在学习Linux的过程中,常会看到一些终端命令或者程序中有">/dev/null 2>&1"出现,由于已经遇到了好几次了,为了理解清楚,不妨花点时间百度或者go ...

  2. [应用]Linux下" >/dev/null 2>&1 "

    转自:http://blog.csdn.net/sunrier/article/details/7695839 这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1 ...

  3. Linux下" >/dev/null 2>&1 "详解

    在学习Linux的过程中,常会看到一些终端命令或者程序中有">/dev/null 2>&1 "出现,由于已经遇到了好几次了,为了理解清楚,不妨花点时间百度或者g ...

  4. linux下/dev/null被误删

    /dev/null文件是一个特殊的设备文件,可以用于清空一些日志文件,或者是使一些信息输出到此文件,用以节省硬盘空间.如果该空文件/dev/null文件被误删除掉, 如何再使用系统命令重新创建并设置该 ...

  5. linux 中 /dev/null和/dev/zero的作用以及区别

    在类Unix操作系统中,设备节点并不一定要对应物理设备.没有这种对应关系的设备被称之为伪设备.操作系统运用了它们实现多种多样的功能,/dev/null和/dev/zero就是这样的设备,类似的还有/d ...

  6. Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程

    Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程 原因: 一般造成这种原因是因为项目中有非守护线程的存在: 解决方案: 一.从Tomcat上解决 方案1:(推荐的方案:因为一台 ...

  7. 015 Linux 标准输入输出、重定向、管道和后台启动进程命令

    目录 1 三种标准输入输出 2 什么是重定向?如何重定向? (1)什么是重定向? (2)如何重定向? 3 管道符以及和它容易混淆的一些符号使用 (1)管道符 | (2)&和&& ...

  8. Linux Shell下”>/dev/null 2>&1“相关知识说明

    0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 &  == ...

  9. linux中>/dev/null 2>&1和2>&1 > /dev/null

    转载:https://www.cnblogs.com/520playboy/p/6275022.html 背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的 ...

随机推荐

  1. redis持久化-AOF

    1.aof文件写入与同步 2.aof重写 重写的目的是为了减小aof文件的体积,redis服务器可以创建一个新的aof文件来代替现有的aof文件,新文件不会有冗余的命令. BGREWRITEAOF:遍 ...

  2. Linux错误记录贴

    add-apt-repository 不要写成 add-apt-repository service  不要写成 sevice 总之在打命令的时候要注意不要拼错单词 对于ls命令权限不够我们可以先su ...

  3. 101道Numpy、Pandas练习题

    无论是数据分析还是机器学习,数据的预处理必不可少. 其中最常用.最基础的Python库非numpy和pandas莫属,很多初学者可能看了很多教程,但是很快就把用法忘光了. 光看不练假把式,今天向大家推 ...

  4. GitHub rename the default branch from master to main

    GitHub rename the default branch from master to main master => main Repository default branch Cho ...

  5. random array & shuffle 洗牌算法 / 随机算法

    random array & shuffle shuffle 洗牌算法 / 随机算法 https://en.wikipedia.org/wiki/Fisher–Yates_shuffle ES ...

  6. Taro 框架实现原理

    Taro 框架实现原理 小程序 H5 RN Web 多端框架 Taro 1.x & Taro 2.x 编译型架构, 语法编译转换 Taro 1/2 属于编译型架构,主要通过对类 React 代 ...

  7. switchable css dark theme in js & html custom element

    switchable css dark theme in js & html custom element dark theme / dark mode https://codepen.io/ ...

  8. Web API & Element & DOM

    Web API & Element & DOM Element https://developer.mozilla.org/en-US/docs/Web/API/Element HTM ...

  9. c++ string split function

    #include <string> #include <vector> #include <regex> struct SplitListItem { std::s ...

  10. 发布npm包时,发布源码,而不是dist后的打包文件

    基于webpack-scaffold 此脚手架配置 删除.gitignore文件中对dist文件夹的无视配置 修改package.json文件 { "private": true, ...