linux下 > /dev/null 2 > &1 的意思和如何在后台启动进程
一、几个基本符号及其含义
之前看到别人写的一个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 的意思和如何在后台启动进程的更多相关文章
- Linux下">/dev/null 2>&1 "相关知识说明
在学习Linux的过程中,常会看到一些终端命令或者程序中有">/dev/null 2>&1"出现,由于已经遇到了好几次了,为了理解清楚,不妨花点时间百度或者go ...
- [应用]Linux下" >/dev/null 2>&1 "
转自:http://blog.csdn.net/sunrier/article/details/7695839 这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1 ...
- Linux下" >/dev/null 2>&1 "详解
在学习Linux的过程中,常会看到一些终端命令或者程序中有">/dev/null 2>&1 "出现,由于已经遇到了好几次了,为了理解清楚,不妨花点时间百度或者g ...
- linux下/dev/null被误删
/dev/null文件是一个特殊的设备文件,可以用于清空一些日志文件,或者是使一些信息输出到此文件,用以节省硬盘空间.如果该空文件/dev/null文件被误删除掉, 如何再使用系统命令重新创建并设置该 ...
- linux 中 /dev/null和/dev/zero的作用以及区别
在类Unix操作系统中,设备节点并不一定要对应物理设备.没有这种对应关系的设备被称之为伪设备.操作系统运用了它们实现多种多样的功能,/dev/null和/dev/zero就是这样的设备,类似的还有/d ...
- Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程
Linux下tomcat的shutdown命令可以关闭服务但是杀不死进程 原因: 一般造成这种原因是因为项目中有非守护线程的存在: 解决方案: 一.从Tomcat上解决 方案1:(推荐的方案:因为一台 ...
- 015 Linux 标准输入输出、重定向、管道和后台启动进程命令
目录 1 三种标准输入输出 2 什么是重定向?如何重定向? (1)什么是重定向? (2)如何重定向? 3 管道符以及和它容易混淆的一些符号使用 (1)管道符 | (2)&和&& ...
- Linux Shell下”>/dev/null 2>&1“相关知识说明
0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 & == ...
- linux中>/dev/null 2>&1和2>&1 > /dev/null
转载:https://www.cnblogs.com/520playboy/p/6275022.html 背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的 ...
随机推荐
- 记一次 lampiao渗透(Drupal+脏牛提权)
vulnhub|渗透测试lampiao 题记 最近在打靶机,发现了一个挺有意思的靶机,这里想跟大家分享一下. 环境准备 vulnhub最近出的一台靶机 靶机(https://www.vulnhub.c ...
- WebAssembly in Action
WebAssembly in Action 数据加密,反爬虫,防盗链,版权保护,数据追踪,埋点 blogs 加密,js 禁用检测,权限控制 WebAssembly 防盗链 wasm online id ...
- zrender & svg
zrender & svg window.prompt double click https://codepen.io/xgqfrms/pen/jOEGNvw // https://cdn.x ...
- 应该如何看待VAST的未来价格与价值?
提起数字货币的价格,很多币圈人士都是滔滔不绝,随口一举例,便是百倍千倍的数字货币.可是提起数字货币的价值,就很少有币圈人士能举出几个有力的例子,常常顾左右而言他,场面十分尴尬.之所以会这样,是因为很多 ...
- 为什么NGK推出的DEFI项目这么火热?
进入到2020年的下半年,DeFi的锁仓量基本上是以日破新高的态势,不断的成为一个独角兽.DeFi逐渐形成一个独角兽的同时,也在不断的给区块链生态赋能,源源不断进行金融价值输送.所以加密货币体量的不断 ...
- Python元组拆包捡到8倍镜快准狠
元组拆包 元组是不可变列表,列表是通过索引取值的,元组也是: tuple_test = (1, 2, 3) a = tuple_test[0] b = tuple_test[1] c = tuple_ ...
- 大数据开发-linux下常见问题详解
1.user ss is currently user by process 3234 问题原因:root --> ss --> root 栈递归一样 解决方式:exit 退出当前到ss再 ...
- 【死磕JVM】JVM快速入门之前戏篇
简介 Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台.javac编译好后的class文件,在Windows.Linux.Mac等系统上,只要该系统安装对应的 ...
- iOS拍个小视频
需求 公司混合开发,uni端拍小视频不是很理想,为达到仿微信效果,原生插件走起 思路 第1步:1个AVCaptureSession, 1块AVCaptureVideoPreviewLayer[考虑兼容 ...
- 京东数科二面:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?
IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...