Linux nohup后台运行命令

# 后台运行,并且有nohup.out输出
nohup xxx &

# 后台运行, 不输出任何日志
nohup xxx > /dev/null &

# 后台运行, 并将错误信息做标准输出到日志中 
nohup xxx >out.log 2>&1 &

linux 输出到后台 > /dev/null 2>&1 详解

萧-青

于 2022-01-05 17:46:41 发布

3026
收藏 13
分类专栏: linux 文章标签: linux 运维 服务器
版权

华为云开发者联盟
该内容已被华为云开发者联盟社区收录,社区免费抽好礼🎁,最高可得Switch!
加入社区

linux
专栏收录该内容
14 篇文章3 订阅
订阅专栏
一些终端命令、程序、脚本(crontab)中,常会遇到,">/dev/null 2>&1 "出现,这具体代表什么意思呢,接下来会一步步操作,大概理清楚流程及作用(咳咳,那个,一些linux内置的方法咱就不理了)

先解释一下字面意思:

>/dev/null 就是重定向,将结果(标准输出)重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。1>/dev/null 也是一样的,因为不写的话默认是 1

2>&1 就是将 标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。通俗点说,& 表示等同于的意思,2>&1,表示2的输出重定向等于于1

原由:

shell脚本

注:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。shell实际上可以理解为一个命令解释器,既是一种命令语言,又是一种程序设计语言。

对于某些后台来说,一般是输入某些参数来进行计算或查询,或者是定时任务,那么我们有时候就会需要知道脚本运行的结果,而这个结果是直接输出到控制台,还是输出到一个文件内,有时在运行的过程中会有堆栈的异常,外部接口调用的情况,这些异常的结果,我们一般都会写到日志内,这就是shell重定向,也就是这篇文章要讲的内容。

再讲重定向之前,还需要知道一些linux的基础。下面会一一讲解。

linux标准文件描述符

文件描述符 类型 默认情况 对应文件句柄位置
0 标准输入(缩写:STDIN) 从键盘获得输入 /proc/self/fd/0
1 标准输出(缩写:STDOUT) 输出到屏幕(即控制台) /proc/self/fd/1
2 错误输出(缩写:STDERR) 输出到屏幕(即控制台) /proc/self/fd/2
我们平常执行shell命令,都是将命令输入,然后结果显示到控制台,但,也可以通过更改文件描述符的指向,来将结果输入到我们自定义的文件,1 代表标准结果输出,2 代表错误输出,举个例子。

输出重定向

cd /home/script/ && /home/php5210/bin/php dis_file.php > /dev/null 2>&1

这个就是在机器上有 /home/script/ 路径 ,由于机器没有安装php环境变量(就算安装了,为了稳妥起见,也会选择这种方式),所以 /home/php5210/bin/php 准备执行 dis_file.php 文件

至于最后的两个,

> /dev/null

其中 > 代表 输入到 的意思,将左边内容输入到右边。>> 表示追加。

注:一个 > 是生成文件,若以前有文件,会删除,重新覆盖本次执行的内容

 

这个是输入正常标准结果,接下来试试错误的输出结果到文件:2 > 日志名称

 

 

输入重定向

命令 介绍
command <filename 以filename文件作为标准输入
command 0<filename 同上
command <<delimiter 从标准输入中读入,直到遇到delimiter分隔符
输出重定向是 > 追加是 >>,同理:

输入重定向就是 < 号,追加就是 << ,看例子

 

有服务器的话,可以自己试一下。

正题

还是上面的例子,重新写一下:

cd /home/script/ && /home/php5210/bin/php dis_file.php > /dev/null 2>&1

> /dev/null 2>&1 ,拆成两个(貌似跟文章开始解释的重复,凑合着看吧)

1、> /dev/null 相当于 1> /dev/null,就是将标准输出,重定向到 /dev/null ,/dev/null 表示Linux的空设备文件 ,写到里面,就找不着,等于没写,不用挣扎了,真的找不到的。

2、 2>&1 就是重定向绑定,&是用来连接的,就是绳子,将两个输出(标准输出、错误输出)绑定到一块,一根绳儿上的蚂蚱。这样一来,错误输出,嘿嘿,你也找不到,不需要错误输出。

扩展一下:

> /dev/null 2>&1 2>&1 > /dev/null > /dev/null 2> /dev/null 区别

我们最常见的是第一种写法 > /dev/null 2>&1 ,这个不做解释了,直接看第二种写法:

2>&1 > /dev/null

linux在执行shell命令之前,已经默认会确定好输出位置,并从左往右执行重定向命令,所以对于这个来说,错误输出,仍是会输出到屏幕,不会丢弃

> /dev/a.log 2> /dev/a.log

如果连续写两个这个,有可能会出现乱码(应该是有极大可能),因为会强占通往a.log的管道,所以,尽量不要这么搞,无解,老老实实按照正常写的来吧,代码嘛,最强大的,ctrl+c ctrl+v
————————————————
版权声明:本文为CSDN博主「萧-青」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39131177/article/details/122306023

posted @ 2022-08-29 16:34  技术颜良  阅读(366)  评论(0编辑  收藏  举报