Linux 温习(九): IO 重定向与进程管道

简介: I/O输入/输出(Input/Output)的简称,I 即为输入,常见的输入设备有键盘和鼠标。O为输出,常见的打印机等。

I/O 重定向

基本知识介绍

什么是I/O

I/O输入/输出(Input/Output)的简称,I 即为输入,常见的输入设备有键盘和鼠标。O为输出,常见的打印机等。

什么是I/O重定向

学过HTML都知道,重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置,(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向),I/O重定向是把标准的输入与输出到其他文件或者其他终端

例如 1:终端0输入消息到终端1那么此过程叫做重定向(将终端0上的 ‘Redirect’ 重定向到终端 1

# 终端 0
> tty
/dev/pts/0
> echo 'Redirect' > /dev/pts/1
>
# 终端 1
[root@localhost ~]# tty
/dev/pts/1
[root@localhost ~]# Redirect

例如 2:将date输出的结果重定向到date.txt

> date > date.txt
> cat date.txt
Sun Apr  3 11:20:32 CST 2022

Linux 的标准输入与输出

在/proc虚拟机文件系统中,可以查看内核与进程的一些信息,其中有很多数字

> ls /proc/2191/fd -li
total 0
32321 lr-x------ 1 root root 64 Apr  3 10:13 0 -> /dev/null
32322 l-wx------ 1 root root 64 Apr  3 10:13 1 -> /dev/null
32323 l-wx------ 1 root root 64 Apr  3 10:13 2 -> /dev/null
32324 lrwx------ 1 root root 64 Apr  3 10:13 3 -> /dev/null

每一个进程在运行时都会打开一些文件,每一个文件都会有一个指定的数字标识,这个标识就交文字描述符。

上述的进程中有0、1、2、3的文件描述符,这也是绝大多数进程都有的。0 表示标准输入,可以理解为键盘输入;1 表示标准输出,输出到终端;2 表示标准错误,输出到终端;3 及以上为常规文件描述符;

1,2可理解为执行命令时输出的结果,包括失败和成功;这么说可能看不明白,演示几个例子就知道了

使用范例

范例 1:使用不存在的whomi命令,且将错误重定向到 error.txt 文件中 (错误不在输出)

> whomi
-bash: whomi: command not found
> whomi 2> error.txt
> cat error.txt 
-bash: whomi: command not found

范例 2:将date输出的内容重定向到date.txt

> date 1> date.txt
> cat date.txt
Sun Apr  3 12:20:32 CST 2022

有同学可能会有疑问 > 就直接输出了吗? 为什么还要 1> 其实系统是默认有1的,不加默认就是1;

输出重定向

输出重定向分为正确输出和错误输出

正确输出:1> 、1>> 等价于>、>>,1可省略

错误输出:2>、2>>

其中>表示覆盖,>>表示追加

使用范例

范例 1:输出重定向(覆盖)

> date 1> date.txt
> cat date.txt 
Sun Apr  3 14:45:34 CST 2022

范例 2:输出重定向(追加)

> date 1>> date.txt
> cat date.txt 
Sun Apr  3 14:45:34 CST 2022
Sun Apr  3 14:46:18 CST 2022

范例 3:错误输出到重定向

> ls /home/linux
ls: cannot access /home/linux: No such file or directory
> ls /home/linux 2>error.txt
> cat error.txt 
ls: cannot access /home/linux: No such file or directory

范例 4:正确结果与错误结果都输出到相同位置

> ll /home/ /home/linux &>list.txt
> cat list.txt 
ls: cannot access /home/linux: No such file or directory
/home/:
total 200
-rw-r--r--   1 root      root          58 Apr  3 14:46 date.txt
-rw-r--r--   1 root      root          57 Apr  3 14:48 error.txt
-rw-r--r--   1 root      root          57 Apr  3 14:49 list.txt

范例 5:正确结果保存到list.txt,错误结果丢到/dev/null

> ll /home/ /home/linux 1>list.txt 2>/dev/null

输入重定向

输入只有正确输入,且可以带结束符。(EOF、Ctrl+d)

恰好与输出相反:<、<<

使用范例

范例 1:使用grep命令过滤root,没有改变输入端,默认为键盘,接着把输入端重定向到/etc/passwd

> grep 'root'
linxu
root
root
> grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

范例 2:使用at命令创建一个计划,从现在开始 1 分钟后创建用户 linux ,按组合件Ctrl+d结束。

> at now +1 min
at> useradd linux
at> <EOF>

重定向案例

案例 1:利用重定向建立多行文件,并用EOF结束

> cat >file03.txt <<EOF
11
22 
33
EOF
> cat file03.txt
11
22
33

案例 2:多条命名输出重定向(两条以上命令需要加括号)

> ls;date &>/dev/null
date.txt  error.txt  file03.txt  list.txt  memcached  package.xml  redis  root  test.sh  zip-1.20.0  zip-1.20.0.tgz
> ls &>/dev/null ;date &>/dev/null
> (ls;date) &>/dev/null

Subshell

Subshell 是指圆括号里的命令会在另外的进程中执行。当需要让一组命令在不同目录下执行时,采用这种方法可以不修改主脚本的目录

请仔细看当前目录,一直处于home目录中,不加括号则返回到了root目录下。

> ls /root/
anaconda-ks.cfg  install.sh  package.xml
> (cd /root/; ls)
anaconda-ks.cfg  install.sh  package.xml
> 
> cd /root/; ls
anaconda-ks.cfg  install.sh  package.xml
[root@localhost ~]#

如果不希望某些命令执行对当前Shell环境产生影响,请在Subshell中执行(加括号)。

进程管道

管道实际上头也是一种重定向,重定向字符控制输出到文件,管道控制输出到其他程序,其实是将结果传递给下一个程序调用。管道符为“|”

管道中有一种特殊的管道,tee 管道,如果我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee管道,tee管道类似于生活中的三通水管。tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个文件FILE中。

在使用管道时,前一个命令的标准错误不会被 tee 读取

使用范例

范例 1ps 命令结果通过管道给 grep 匹配

> ps -ef |grep php
root       1451      1  0 10:13 ?        00:00:00 php-fpm: master process (/www/server/php/74/etc/php-fpm.conf)
www        1481   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1482   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1485   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1490   1451  0 10:13 ?        00:00:00 php-fpm: pool www
www        1495   1451  0 10:13 ?        00:00:00 php-fpm: pool www
root      22436   3257  0 15:32 pts/0    00:00:00 grep --color=auto php

范例 2:查看系统是否有linux用户

> cat /etc/passwd |grep linux
>

范例 3:使用free命令显示系统内存使用信息,并使用tee命令将信息输出到屏幕,并保存到文件mem.txt

> free -h | tee mem.txt
              total        used        free      shared  buff/cache   available
Mem:           1.8G        1.3G         99M         26M        375M        289M
Swap:          2.0G          0B        2.0G

范例 4:使用 tee 捕获错误(无法捕获)

> ls /home/linux >list.txt  2>&1 
> ls /home/linux  2>&1 | tee list.txt 
ls: cannot access /home/linux: No such file or directory

范例 5:查看系统是否有root用户,将结果打印在屏幕和保存到文件中

> cat /etc/passwd |grep root | tee a.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
> cat a.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
目录
相关文章
|
11天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
35 1
|
7天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
15天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
20天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
27天前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
56 1
|
6月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
136 13
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
186 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
4月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
5月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
175 1