重定向问题

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. pages.json 文件:自定义导航栏

    自定义导航栏使用注意 当navigationStyle设为custom或titleNView设为false时,原生导航栏不显示,此时要注意几个问题: 非H5端,手机顶部状态栏区域会被页面内容覆盖.这是 ...

  2. 为什么 HashMap 会死循环?

    HashMap 死循环发生在 JDK 1.8 之前的版本中,它是指在并发环境下,因为多个线程同时进行 put 操作,导致链表形成环形数据结构,一旦形成环形数据结构,在 get(key) 的时候就会产生 ...

  3. R 数据可视化 : 热图

    本文作者蒋刘一琦,自嘲是一个有艺术追求的生信狗,毕业于浙江大学生物信息学专业,目前在复旦大学就读研究生,研究方向为宏基因组. 在生物信息领域我们常常使用 R 语言对数据可视化.在对数据可视化的时候,我 ...

  4. Linux 调用约定

      函数调用约定是对函数调用时如何传递参数的一种约定.关于它的约定有许多种,下面我们分 别从内核接口和用户接口两方面介绍32位和64位Linux的调用约定. 一.内核接口   x86-32系统调用约定 ...

  5. 2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j。

    2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j. ...

  6. SpringBoot项目启动 报错:Error executing Maven. end tag name </settings> must match start tag name

    SpringBoot项目启动 报错:Error executing Maven. end tag name must match start tag name from line xxx 第一次创建s ...

  7. Spark SQL 及其DataFrame的基本操作

    1.Spark SQL出现的 原因是什么? Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个叫作Data Frame的编程抽象结构数据模型(即带有Schema信息的RDD),S ...

  8. Kali Sublist3r 报错解决办法

    直接将Sublist3r.py中文件的内容替换为下面的即可 具体的更改的东西改了很多地方就不细说了,直接复制粘贴 如果遇到Error: Virustotal probably now is block ...

  9. 根据模板动态生成word(三)使用poi-tl生成word

    @ 目录 一.前言 1.什么是poi-tl 2.官方信息 2.1 源码仓库 2.2 中文文档 2.3 开源协议 3.poi-tl的优势 3.1 poi-tl和其他模板引擎的对比 3.2 poi-tl ...

  10. Java扩展Nginx之三:基础配置项

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 经历了前面两篇的入门和编译源码之后,从本篇起 ...