重定向

正常情况下,我们在Linux的终端用鼠标键盘输入命令(标准输入stdin=0),命令执行结果会打印在终端显示器上(标准输出stdout=1)。错误信息也会打印在终端显示器上(标准错误stderr=2)。 所谓重定向:我们可以把命令的执行结果输出到文本等其他文件设备中(输出重定向)。我们可以不用鼠标键盘等输入设备输入命令需要的参数,而是把文件的内容作为参数给到命令执行,此时的输入设备就变成文件(输入重定向)。

输入重定向:指的是重新指定设备来代替键盘作为新的输入设备; 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备;

输出重定向

#标准输出
[root@centos home]# ls -l
总用量 206492
drwxr-xr-x. 2 zs   root         6 7月  18 10:57 data
-rw-r--r--. 1 root root      8790 7月  19 09:57 history.log
drwx------. 2 root root       144 7月  18 15:45 ls
-rw-r--r--. 1 root root 211426850 7月  18 15:57 ls.tar.gz
-rw-r--r--. 1 root root       412 7月  20 09:33 test2.txt
-rw-r--r--. 1 root root       745 7月  19 14:14 test.txt
drwxr-xr-x. 2 root root         6 7月  19 14:51 zs
 
#重定向输出 命令 > 文件
#通过cat命令我们可以看到ls -l > test2.txt将ls -l产生的结果写入到了test2.txt文件中
#如果要追加写入结果用 >>
[root@centos home]# ls -l > test2.txt
[root@centos home]# cat test2.txt
总用量 206488
drwxr-xr-x. 2 zs   root         6 7月  18 10:57 data
-rw-r--r--. 1 root root      8790 7月  19 09:57 history.log
drwx------. 2 root root       144 7月  18 15:45 ls
-rw-r--r--. 1 root root 211426850 7月  18 15:57 ls.tar.gz
-rw-r--r--. 1 root root         0 7月  20 10:43 test2.txt
-rw-r--r--. 1 root root       745 7月  19 14:14 test.txt
drwxr-xr-x. 2 root root         6 7月  19 14:51 zs
 
#标准错误输出
#jd.txt不存在说一执行cat msg.txt jd.txt这个命令的时候,msg.txt内容会正常读取,但是jd.txt会报错
#2代表标准错误输出,我们把错误信息打印到err.log文件中,把正确的打印到my.log中
[root@centos home]# ls
data  history.log  ls  ls.tar.gz  msg.txt  test.txt  zs
[root@centos home]# cat msg.txt jd.txt 2> err.log 1> my.log
[root@centos home]# cat err.log 
cat: jd.txt: 没有那个文件或目录
[root@centos home]# cat my.log 
你好
 
#把错误和正确都输出到一个文件中2>&1表错误输出合并到标准输出中
[root@centos home]# cat msg.txt jd.txt > my.log 2>&1
[root@centos home]# cat my.log 
你好
cat: jd.txt: 没有那个文件或目录
[root@centos home]# 
 

输入重定向

# 输入重定向 <
#此时会将test.txt文本的内容作为输入内容给到命令执行
[root@centos home]# grep -c "你好" < test.txt
2
[root@centos home]# cat test.txt 
张三你好
你好李四
 
[root@hadoop101 home]# cat out.txt 
/home/
[root@hadoop101 home]# ls < out.txt 
at.txt  cron.txt  demo1.sh  demo2.sh  demo3.sh  demo4.sh  hello.txt  jinmin  lisi  out.txt  s.txt  test.txt  zhangsan
 
#输入输出结合起来用
#将test.txt文件作为输入文件给到命令,命令执行后将结果打印到test3.txt文件
[root@centos home]# grep -c "你好" < test.txt > test3.txt
[root@centos home]# cat test3.txt 
2
 

进程管理

进程优先级

进程优先级是操作系统中用于确定进程执行顺序和资源分配的一个重要概念。每个进程都被赋予一个优先级,优先级教高的进程在竞争资源时更有可能被调度执行。不同的操作系统有不同的进程调度算法和优先级策略,但是一般来说,较高优先级的进程会获得更多的CPU时间片,并在资源分配方面享有更高的优先权。这可以确保重要的任务及时处理,并且可以提高系统的响应性能。

优先级取值范围为(-20,19),Linux 提供的优先级的范围为 -20 ~ 19,启动一个进程时,默认的优先级为 0,其中 -20 的优先级为最大或者说最高

查看进程优先级

[root@centos home]# ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 48421 ep_pol ?        00:00:02 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      4      2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0      6      2  0  80   0 -     0 smpboo ?        00:00:00 ksoftirqd/0
1 S     0      7      2  0 -40   - -     0 smpboo ?        00:00:00 migration/0
1 S     0      8      2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_bh
1 S     0      9      2  0  80   0 -     0 rcu_gp ?        00:00:05 rcu_sched
1 S     0     10      2  0  60 -20 -     0 rescue ?        00:00:00 lru-add-drain
 

说明:Linux命令是前台运行,用户在它完成之前不能执行另一个命令。如果在命令的最后加一个 &,可以让命令同步运行,即后台运行

  • 进程挂起:Ctrl+z
  • 进程终止:Ctrl+c
查看服务的进程pid
[root@hadoop101 bin]# ps -ef | grep "app.py" | grep -v grep | awk '{print $2}'

设置进程的优先级

#可以看到wc命令的优先级被设置为-20
[root@centos home]# nice -n -20 wc &
[root@centos home]# ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 48421 ep_pol ?        00:00:02 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      4      2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0   1781      2  0  80   0 -     0 worker ?        00:00:00 kworker/3:1
4 T     0   1782   1502  0  60 -20 - 27069 do_sig pts/0    00:00:00 wc
0 R     0   1783   1502  0  80   0 - 38331 -      pts/0    00:00:00 ps
 
#改变进程优先级
[root@centos home]# renice -19 1782
1782 (进程 ID) 旧优先级为 -20,新优先级为 -19
[root@centos home]# ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 48421 ep_pol ?        00:00:02 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      4      2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0   1781      2  0  80   0 -     0 worker ?        00:00:00 kworker/3:1
4 T     0   1782   1502  0  61 -19 - 27069 do_sig pts/0    00:00:00 wc
1 S     0   1785      2  0  80   0 -     0 worker ?        00:00:00 kworker/3:0
0 R     0   1787   1502  0  80   0 - 38331 -      pts/0    00:00:00 ps
 
进程挂起与恢复

top命令开启一个实时查看资源占用的进程

Ctrl+z挂起top进程

#jobs命令可以查看被挂起的进程
[root@centos home]# jobs
[1]+  已停止               top
 
#fg恢复被挂起的进程到前台运行
[root@centos home]# jobs
[1]+  已停止               top
[2]-  已停止               tail -f my.log
[root@centos home]# fg 1
 
#bg将一个被挂起的进程激活在后台继续运行
[root@centos home]# jobs
[1]+  已停止               top
[2]-  已停止               tail -f my.log
[root@centos home]# bg 1

定时调度

执行一次的调度

at:是个可以处理仅执行一次就结束调度的指令。要执行 at 时,必须要有 atd 服务的支持

#查看at状态
[root@hadoop101 home]# systemctl status atd
#启用atd服务
[root@centos home]# systemctl start atd
#将atd服务设置为开机自启
[root@centos home]# systemctl enable atd
#查看是否开机自启
[root@hadoop101 home]# systemctl is-enabled atd

at命令的时间格式

HH:MM,如“04:00”
HH:MM YYYY-MM-DD,如“04:00 2015-07-30”
HH:MM[am|pm] [Month] [Date],如“04pm July 30”
HH:MM[am|pm] + number [minutes|hours|days|weeks], 如“now + 5 minutes” 与“04pm + 3days”

示例:

#输入完命令回车,Ctrl+d退出
[root@centos home]# at 15:51
at> echo '12344' > at.txt
at> <EOT>
job 3 at Thu Jul 20 15:51:00 2023
#时间到后可以看到at.txt
[root@centos home]# cat at.txt 
12344
 
#写法2
#将要执行的命令通过echo的方式写给at
[root@centos home]# echo "echo '你好' > at.txt" | at 15:57
job 5 at Thu Jul 20 15:57:00 2023
 
[root@centos home]# cat at.txt 
你好
 
#查看at任务
[root@centos home]# atq
4	Thu Jul 20 15:53:00 2023 a root
 
#删除at任务
[root@centos home]# atrm 4

周期性调度

crontab 是一个定时执行任务的工具,在 Linux 系统中广泛使用。它可以让用户在指定的时间自动执行某个指令或脚本,例如自动备份数据、清除日志、定时运行程序等。

#语法
m h dom mon dow command
#说明
m 表示分钟,h 表示小时,dom 表示一个月份中的第几日,mon 表示月份,dow 表示一个星期中的第几天。command 表示要执行的程序。
 m * 时,表示每分钟都要执行;当 h * 时,表示每小时都要执行程序。其余以此类推。
 m a-b 时,表示从第 a 分钟到第 b 分钟这段时间内要执行;当 h a-b 时,表示从第 a 小时到第 b小时都要执行。其余以此类推。
 m */n 时,表示每 n 分钟时间间隔执行一次;当 h */n 时,表示每 n 小时时间间隔执行一次。其余以此类推。
 m a、b、c……时,表示第 a、b、c……分钟要执行;当 h a、b、c……时,表示第 a、b、c……个小时要执行。其余以此类推。
 
#时间示例
 
#每分钟执行一次
*/1 * * * *
 
#每天00:05执行
5 0 * * *
 
#每月1号14:15
15 14 1 * *
 
#每周从周一到周五 22:00
0 22 * * 1-5
 
示例:
#进入定时任务编辑
[root@centos home]# crontab -e
 
#在编辑窗口输入
*/1 * * * * echo "你好" >> /home/cron.txt
 
#查看定时任务
[root@centos home]# crontab -l
*/1 * * * * echo "你好" >> /home/cron.txt
 
#几分钟后可以查看cron.txt
[root@centos home]# cat cron.txt 
你好
你好
你好
你好
你好