Linux重定向与管道
目 录
4.1 重定向:改变标准输入、标准输出的方向的就是重定向 1
信号管理进程
使用kill命令发送信号和进程通信
定义守护进程的角色
结束用户会话和进程
kill命令
kill命令:kill命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。
kill:后面接进程PID 杀死进程
[root@oldboy ~]# ps aux | grep vim
root 63112 0.0 1.0 151580 5084 pts/0 S+ 17:46 0:00 vim 123.txt
root 63162 0.0 0.2 112720 968 pts/1 R+ 17:47 0:00 grep --color=auto vim
[root@oldboy ~]# kill 63112
-l:列出全部的信息名称
-15:TERM:终止进程
-9:强制终止
-1:挂起信号,可以让进程重新配置
killall命令
killall命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程
root 63747 0.0 1.0 151580 5080 pts/0 S+ 17:59 0:00 vim 123.txt
root 63781 0.0 1.0 151404 5064 pts/1 S+ 17:59 0:00 vim anaconda-ks.cfg
root 63927 0.0 0.2 112720 972 pts/2 R+ 18:02 0:00 grep --color=auto vim
[root@oldboy ~]# killall vim
pkill
pkill命令:可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。
-u:后面接用户名,踢出登录用户,关闭终端
[root@oldboy ~]# w
18:06:53 up 23:01, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 16:51 3:01 0.05s 0.05s -bash
oldboy pts/1 10.0.0.1 18:06 8.00s 0.00s 0.00s -bash
root pts/2 10.0.0.1 17:59 5.00s 0.02s 0.00s w
[root@oldboy ~]# pkill -u oldboy
-t:终端名,结束终端所有程序
[root@oldboy ~]# pkill -t pts/1
[oldboy@oldboy ~]$ vim 123.txt
Vim: Caught deadly signal TERM
Vim: Finished.
已终止
[oldboy@oldboy ~]$
-t -9:强制结束指定程序并关闭终端
[root@oldboy ~]# pkill -t -9 pts/1
后台进程管理
jobs
jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。
jobs
-l:显示进程号
[root@oldboy ~]# jobs -l
[1]+ 62110 停止 vim 123.txt
-r:仅显示运行(running)的任务
-s:仅显示睡眠状态(sleeping)的任务
[root@oldboy ~]# jobs -l
[1]+ 62110 停止 vim 123.txt
[2]- 62259 运行中 sleep 1000 &
[root@oldboy ~]# jobs -r
[2]- 运行中 sleep 1000 &
[root@oldboy ~]# jobs -s
[1]+ 已停止 vim 123.txt
bg命令
bg命令用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号&的效果是相同的,都是将其放到系统后台执行。
[root@oldboy ~]# jobs
[1]+ 已停止 sleep 20000
[root@oldboy ~]# bg 1
[1]+ sleep 20000 &
将一个程序放在后台运行 的另一种方法
[root@oldboy ~]# sleep 2000 &
[1] 62626
fg命令
fg命令用于将后台作业(在后台运行的或者在后台挂起的作业)放到前台终端运行。与bg命令一样,若后台任务中只有一个,则使用该命令时,可以省略任务号
[root@oldboy ~]# jobs
[1]+ 运行中 sleep 20000 &
[root@oldboy ~]# fg 1
sleep 20000
sleep命令
sleep命令
时间:指定要暂停时间的长度。
时间长度,后面可接 s、m、h 或 d,其中 s 为秒,m 为 分钟,h 为小时,d 为日数。
暂停5秒钟
[root@oldboy ~]# sleep 5
[root@oldboy ~]#
这是一个在脚本中控制时间的重要命令 例如每隔3面输出一行hello would!
while true
do
echo "hello would!"
sleep 3
done
标准输入和输出
标准输入和输出
执行一个shell程序时通常会自动打开三个标准文件
[root@oldboy ~]# vim 123.txt
[1]+ 已停止 vim 123.txt
[root@oldboy ~]# jobs -l
[1]+ 64561 停止 vim 123.txt
[root@oldboy ~]# ll /proc/64561/fd
总用量 0
lrwx------ 1 root root 64 8月 22 18:13 0 -> /dev/pts/2
lrwx------ 1 root root 64 8月 22 18:13 1 -> /dev/pts/2
lrwx------ 1 root root 64 8月 22 18:13 2 -> /dev/pts/2
lrwx------ 1 root root 64 8月 22 18:13 4 -> /root/.123.txt.swp
[root@oldboy ~]# ll /dev/std*
lrwxrwxrwx 1 root root 15 8月 20 14:49 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 8月 20 14:49 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 8月 20 14:49 /dev/stdout -> /proc/self/fd/1
标准输入(STDIN,文件描述符为0):通常对应终端的键盘,也可从其他文件或命令或者文件内容中输入。
标准输出(STDOUT,文件描述符为1):默认输出到屏幕。
错误输出(STDERR,文件描述符为2):默认输出到屏幕。
文件名称(filename,文件描述符为3+)
进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
进程使用文件描述符(file descriptors)来管理打开的文件
输出重定向
1.当屏幕输出的信息很重要,而且我们需要将他存下来的时候;
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
3.系统的执行命令, 例如定时任务的执行结果,希望他可以存下来时;
4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;
5.错误信息与正确信息需要分别输出时;
重定向:改变标准输入、标准输出的方向的就是重定向
标准覆盖输出重定向 >
标准追加输出重定向 >>
错误覆盖输出重定向 2>
错误追加输出重定向 2>>
输入重定向 <
类型 | 操作符 | 用途 |
标准覆盖输出重定向 | > | 将命令的执行结果输出到文件中,而不是直接显示在屏幕上 |
标准追加输出重定向 | >> | 将命令执行的结果追加输出到指定的文件 |
标准输入定向 | < | 将命令中接受输入的途径由默认的键盘更改为指定的文件 |
标准输出重定向(覆盖)
标准输出重定向,先清空,后写入,如果文件不存在则创建
[root@oldboy ~]# echo hello > 123.txt
标准输出重定向(追加)
标准输出重定向,在源文件基础上追加新的内容
[root@oldboy ~]# echo word >> 123.txt
错误输出重定向
正确输出以及错误输出重定向到指定的文件内
查询/etc目录下的以.conf结尾的文件,查询成功的输出到1.txt中,失败的保存到2.txt中
[oldboy@oldboy ~]$ find /etc/ *.conf 1>1.txt 2>2.txt
正确错误的都输出到同一个文件中
查询/etc目录下的所有以.conf结尾的文件将成功和失败的结果都保存到一个文件中
[oldboy@oldboy ~]$ find /etc *.conf &>1.txt
正确的错误的都输入到相同的位置
重定向到相同的位置
[root@oldboy pubilc]# ls /root /error >ab 2>&1
重定向到空/dev/null
空设备,即将产生的输出丢掉
[root@oldboy ~]# ls /root /error >ab 2>/dev/null
[root@oldboy ~]# ls /root /error >ab &>/dev/null
脚本中使用重定向
[root@oldboy ~]# vim ping.sh
ping -c1 10.0.0.200
if [ $? -eq 0 ];then
echo "10.0.0.200 is up."
else
echo "10.0.0.200 is down."
fi
[root@oldboy ~]# chmod +x ping.sh
[root@oldboy ~]# ./ping.sh
//改进后版
[root@oldboy ~]# vim ping.sh
ping -c1 10.0.0.200 &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.200 is up."
else
echo "10.0.0.200 is down."
fi
脚本中使用重定向
[root@oldboy ~]# vim ping2.sh
ping -c1 10.0.0.200 &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.200 is up." >>up.txt
else
echo "10.0.0.200 is down." >>down.txt
fi
[root@oldboy ~]# chmod +x ping2.sh
[root@oldboy ~]# ./ping2.sh
输入重定向
表中输入:<等价于0<
邮件服务
安装sendmail和xmail
[root@oldboy ~]# yum install -y sendmail mailx
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
修改主机解析:在hosts文件中加入本机的主机名和ip地址
[root@oldboy ~]# vim /etc/hosts
10.0.0.100 oldboy
重启服务
[root@oldboy ~]# systemctl restart sendmail
发邮件 mail 邮箱地址 ; subject:主题 ; 邮件内容 ; .号结束邮件;
[root@oldboy ~]# mail 228361008@qq.com
Subject: 123
12345
123345
.
EOT
检测是否收到邮件
[root@oldboy ~]# su - oldboy
[oldboy@oldboy ~]$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/oldboy": 2 messages
> 1 root Wed Aug 22 11:25 21/651 "asd"
发邮件时将指定文件内容发送
[root@oldboy ~]# mail -s "test" oldboy < /etc/hosts
输入重定向给grep 执行查询操作
[root@oldboy ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dd生成指定大小的文件
if=/dev/zero if是源
of=file.txt 是目标
bs 是单个大小
count是文件数量
最后要生成的文件大小等于bs乘以count
[root@oldboy ~]# dd if=/dev/zero of=file.txt bs=5M count=4
记录了4+0 的读入
记录了4+0 的写出
20971520字节(21 MB)已复制,0.022939 秒,914 MB/秒
[root@oldboy ~]# ll file.txt -h
-rw-r--r-- 1 root root 20M 8月 22 22:03 file.txt
mysql导入表结构
安装mariadb数据库
[root@oldboy ~]# yum install -y mariadb
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
表结构导入
[root@oldboy ~]# mysql -uroot -p123 <bbs.sql
利用重定向建立多行文件
[root@oldboy ~]# cat >> file.txt
12334
124
2134
[root@oldboy ~]# cat file.txt
12334
124
2134
利用重定向建立多行文件
[root@oldboy ~]# cat > file.txt <<a
> sdf
> sdfg
> df
> a
[root@oldboy ~]# cat file.txt
sdf
sdfg
df
进程管道技术
管道操作符号"|"连接两个命令,将左侧的标准输出,交给右侧的标准输入
格式:cmd1 | cmd2 [...| cmdn]
示例:使用管道和cut截取passwd中的用户名使用的shell 的数量,排序
[root@oldboy ~]# cut -d":" -f7 /etc/passwd | sort | uniq -c | sort -nr
18 /sbin/nologin
3 /bin/bash
1 /sbin/shutdown
1 /sbin/halt
1 /bin/sync
示例:打印根分区已用空间的百分比(只打印数字)
[root@oldboy ~]# df | grep /$| awk '{print $5}' | awk -F% '{print $1}'
8
tee管道技术
找IP地址,并且保存tee
[root@oldboy ~]# ip a | grep "inet "| awk '{print $2}'| tee 1.txt | awk -F\/ '{print $1}'
127.0.0.1
10.0.0.100
[root@oldboy ~]# cat 1.txt
127.0.0.1/8
10.0.0.100/24
[root@oldboy ~]# ifconfig | sed -nr 2's#^.*inet (.*) netmask.*$#\1#gp'| tee 2.txt
10.0.0.100