重定向问题

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. DataGridViewImageColumn 图片照片

    Private Sub BT_PHOTOADDRESS_Click(sender As Object, e As EventArgs) Handles BT_PHOTOADDRESS.Click Di ...

  2. 「P4」试下1个半月能不能水出个毕设

    期间的一些感想 对于这个时间的把控,前一个月实际上我什么都没做,现在都堆在最后的半个月了 在做毕业设计的阶段,我总结了一个教训,就是:「慢就是快」,我想这句话可能对我以后的学习都会有比较大的影响.我是 ...

  3. this关键字理解

    编译器对对象的加载步骤: (1)类名 (2)成员变量 (3)成员方法 即使定义类时,成员变量写在成员方法后面,加载对象时,也是先加载成员变量 当编译器识别方法时,会对成员方法改写,在所有方法里隐藏一个 ...

  4. harbor仓库主从同步

  5. shell学习总结

    shell教程 第一个shell脚本 打开文本编辑器(可以使用 vi/vim 命令来创建文件), 新建一个文件 test.sh,扩展名为 sh(sh代表shell) #!/bin/bash echo ...

  6. 手把手教你实战TDD

    1. 前言 领域驱动设计,测试驱动开发. 我们在<手把手教你落地DDD>一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解.T ...

  7. C++面试八股文:聊一聊指针?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面: 面试官:聊一聊指针? 二师兄:好的. 面试官:你觉得指针本质上是什么? 二师兄:这要从内存地址开始说起了.如果有一块容量是1G的内存,假设 ...

  8. 【C#/.NET】使用Automapper映射record类型

    ​ 当使用Automapper进行对象映射时,通常我们会使用POCO(Plain Old CLR Object)类作为源对象和目标对象.然而,自从C# 9引入了record类型,它们提供了更简洁.不可 ...

  9. 白嫖一个WebAPI限流解决方案

    什么是API限流: API 限流是限制用户在一定时间内 API 请求数量的过程.应用程序编程接口 (API) 充当用户和软件应用程序之间的网关.例如,当用户单击社交媒体上的发布按钮时,点击该按钮会触发 ...

  10. DevOps|从腾讯TEG CDC解散聊技术中台价值和建设

    近日一则腾讯TEG CDC整个部门解散的消息在很多群里炸了锅,有的唱衰互联网行业,有的唉声叹气,还有的甩锅到 AGI 的发展.总体上来说,这个事情的确已经发生了,我想从组织架构和整体效能这两方面来分析 ...