重定向问题

Linux shell 中 2>&1 的含义

首先了解下1和2在Linux中代表什么,先整理一份在Linux系统中0 1 2是一个文件描述符:

名称 代码 操作符 Java中表示 Linux 下文件描述符(Debian 为例)
标准输入(stdin) 0 < 或 << System.in /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0
标准输出(stdout) 1 >, >>, 1> 或 1>> System.out /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0
标准错误输出(stderr) 2 2> 或 2>> System.err /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0

从上表看的出来,我们平时使用的

echo "hello" > t.log

其实也可以写成

echo "hello" 1> t.log

关于2>&1的含义

含义:将标准错误输出重定向到标准输出

符号>&是一个整体,不可分开,分开后就不是上述含义了。

比如有些人可能会这么想:2是标准错误输入,1是标准输出,>是重定向符号,那么"将标准错误输出重定向到标准输出"是不是就应该写成"2>1"就行了?是这样吗?

如果是尝试过,你就知道2>1的写法其实是将标准错误输出重定向到名为"1"的文件里去了

写成2&>1也是不可以的

为什么2>&1要放在后面

考虑如下一条shell命令

nohup java -jar app.jar >log 2>&1 &

为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?

我们不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:

本来1----->屏幕 (1指向屏幕)

执行>log后, 1----->log (1指向log)

执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)

再来分析下

nohup java -jar app.jar 2>&1 >log &

本来1----->屏幕 (1指向屏幕)

执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)

执行>log后, 1----->log (1指向log,2还是指向屏幕)

所以这就不是我们想要的结果。简单做个试验测试下上面的想法:

java代码如下:

public class Htest {
public static void main(String[] args) {
System.out.println("out1");
System.err.println("error1");
}
}

javac编译后运行下面指令:

java Htest 2>&1 > log

你会在终端上看到只输出了"error1",log文件中则只有"out1"

每次都写">log 2>&1"太麻烦,能简写吗?

有以下两种简写方式

&>log
>&log

比如上面小节中的写法就可以简写为:

nohup java -jar app.jar &>log &

上面两种方式都和">log 2>&1"一个语义。

那么?上面两种方式中&>和>&有区别吗?——语义上是没有任何区别的,但是第一中方式是最佳选择,一般使用第一种

后台运行命令

nohup 和 & 有什么区别

假如今天我准备在服务器后台启动一个java服务,于是我使用nohup java -jar命令启动,日志输出到nohup.out文件里。

但是当我使用Ctrl + C退出后,发现服务已经关闭了,查看日志发现服务已经被停掉了。于是我换了一种启动方式,使用

&符号启动后台服务,使用Ctrl + C退出后,lsof -i查看端口发现服务还在,但是当我推出终端,再连接上服务器后,发

现服务已经关闭了。经过查资料发现,需要使用nohup和&符号一起使用,需要nohup java -jar 后面加上&符号,启动后,

我们再使用lsof -i查看端口,服务没有问题,退出服务器连再进入,查看端口,发现服务也没有问题。

我们来总结一下:

&

nohup

总结

ps aux和ps -ef有什么区别

Linux下显示系统进程的命令ps,最常用的有ps -ef和ps aux,这两个到底有什么区别呢,讨论这个问题,要追溯到Unix系统中的两个风格,syetem V风格,ps aux最初用到Unix Style中,而ps -ef被用在system V style中,两者输出略有不同,现在大部分Linux系统都是可以同时使用这两种风格的

ps -ef 是用标准的格式显示进程的,其格式如下

其中各列的内容意思如下

UID 用户的ID ,但输出的是用户名

PID 进程的ID

PPID 父进程的ID

C 进程占用CPU的百分比

STIME 进程启用到现在的时间

TTY 该进程在哪个终端上运行,若与终端无关,则显示?,若为pts/0等,则表示由网络连接主机进程

CMD 命令的名称和参数

ps aux是用BSD的格式来显示,其格式如下

其中各列的内容意思如下

USER 用户名

%CUP 进程占用的CUP百分比

%MEM 占用内存的百分比

VSZ 该进程使用的虚拟内存量(KB)

RSS 该进程占用的固定内存量(KB)(驻留页中的数量)

STAT 进程的状态

START 该进程被触发启动的时间

TIME 该进程实际使用CUP运行的时间

COMMEND 所执行的命令

STAT转态常见的状态字符有

D 无法中断的休眠状态

R 正在执行中

S 处于休眠状态

T 停止或被追踪

W 进入内存交换(从内核2.6开始无效)

X 死掉的进程(基本很少见)

Z 僵尸进程(不存在但暂时无法消除)

< 优先级高的进程

N 优先级较低的进程

L 有些页面被锁进内存

s 进程的领导者(在它之下有子进程)

l 多线程,克隆线程

+ 位于后台的进程组

Linux学习疑惑总结的更多相关文章

  1. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  2. Linux学习日记-使用EF6 Code First(四)

    一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是  请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...

  3. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码

    在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...

  4. Linux学习笔记之兄弟连

    systemctl --user enable pulseaudio说明:安装完成后系统没有声音,用该命令可以打开.ifconfig eth0 192.168.118.1说明:给网卡设置IP地址.ap ...

  5. Linux学习内容

    Linux学习要点(转载自红联) 一.学习Linux的基本要求1. 掌握至少50个以上的常用命令. 2. 熟悉Gnome/KDE等X-windows桌面环境操作 . 3. 掌握.tgz..rpm等软件 ...

  6. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  7. Linux学习心得之 Linux下命令行Android开发环境的搭建

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...

  8. Linux学习心得之 Linux下ant安装与使用

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下ant安装与使用 1. 前言2. ant安装3. 简单的a ...

  9. 实验楼 linux 学习

    实验楼 linux 学习     一.Linux 用户管理 1.查看用户 who am i // who mom likes whoami   ====--------====== 输入的第一列表示打 ...

  10. linux学习网站分享

    http://www.zhihu.com/question/19895288 http://linux.vbird.org/ 两个linux学习的网页存起来,以后学习.

随机推荐

  1. 2021-06-28:最接近目标值的子序列和。给你一个整数数组 nums 和一个目标值 goal 。你需要从 nums 中选出一个子序列,使子序列元素总和最接近 goal 。也就是说,如果子序列元素和

    2021-06-28:最接近目标值的子序列和.给你一个整数数组 nums 和一个目标值 goal .你需要从 nums 中选出一个子序列,使子序列元素总和最接近 goal .也就是说,如果子序列元素和 ...

  2. c#构建具有用户认证与管理的socks5代理服务端

    Socks 协议是一种代理 (Proxy) 协议, 例如我们所熟知的 Shdowsocks 便是 Socks 协议的一个典型应用程序, Socks 协议有多个版本, 目前最新的版本为 5, 其协议标准 ...

  3. 选择结构do...while语句

    // do..while语句 #include<stdio.h> int main() { int a = 0; do { a++; printf("HelloWorld\n&q ...

  4. AcWing 1215. 小朋友排队

    n个小朋友站成一排. 现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度. 开始的时候,所有小朋友的不高兴程度都是 0. 如果某个小朋友第一次 ...

  5. POJ - 2251 地下城主

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  6. Vue 路由router

    简单案例: App.vue是核心组件,其中的<router-link>相当于a标签,to相当于href,export是暴露函数,这样某组件才能被其他组件识别到 代码: <templa ...

  7. 最全的git操作命令(持续更新)

    当前使用git进行版本管理越来越频繁,但是难免还是有些命令记不全,曾当前闲暇记录一下,免得需要时漫天找寻 目录 一. 配置用户信息 1.git config [配置git 用户信息] 2.git co ...

  8. web自动化04-css定位

    css元素定位 1. 是什么? 用来描述html元素的显示样式 选择器是一种模式,用于选择需要添加样式的元素   selenium中推荐使用css定位,比XPath定位要快    2.如何定位?   ...

  9. 02.详解盒子模型&选择器初识

    1.Div盒子 用div做圆 能否优化,去掉div之间的距离?margin属性 用表格做圆 2.CSS样式 总结:需要注意的是行级标签设置宽高不会生效 小练习:使用span标签 3.CSS选择器演示及 ...

  10. FTL没有映射管理,跟上班没有钱有什么区别

    大家好,我是五月. 前言 FTL(Flash Translation Layer),即闪存转换层,是各种存储设备的核心算法,作用是将Host传下来的逻辑地址转换成物理地址,也就是映射. 可以说,地址映 ...