进程管理与计划任务(1)-进程管理与job control
每周二、四、六定期更新,我们不见不散!
进程管理
程序(program)和进程(process)
程序(program):通常为 binary program ,放置在硬盘上, 静态数据。
进程(process):程序被触发后,执行者的权限与属性、程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID)。程序就是一个正在运行中的程序。
父进程 & 子进程
在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容就需要把那些需要对地址空间中的数据进行访问的操作部分放到另外一个进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。这就是创建子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进程在运行期间的一个过程。为此,需要由父进程来掌握子进程的启动、执行和退出。
父子进程的关系
资源方面:子进程的代码段是与父进程共享,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,既然为副本,也就是说,二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行。
文件描述符方面:继承父进程的文件描述符时,相当于调用了dup函数,父子进程共享文件表项,即共同操作同一个文件,一个进程修改了文件,另一个进程也知道此文件被修改了。
[root@studyclub ~]# ps -l # 查看当前系统中有哪些进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 16486 16484 0 80 0 - 28893 do_wai pts/0 00:00:00 bash
0 R 0 16920 16486 0 80 0 - 38309 - pts/0 00:00:00 ps
[root@studyclub ~]# bash # 新启动一个bash进程
[root@studyclub ~]# ps -l # 我们来看新启动后的进程的ID信息
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 16486 16484 0 80 0 - 28893 do_wai pts/0 00:00:00 bash
4 S 0 16921 16486 0 80 0 - 28893 do_wai pts/0 00:00:00 bash # 这个是新启动的进程,我们可以看到PPID是16486,即父进程号是16486,即我们执行bash命令的那个终端
0 R 0 16932 16921 0 80 0 - 38309 - pts/0 00:00:00 ps
job control
为了在一个bash里执行多个任务。需要把运行时间长的任务放到后台运行,以保证前台可以正常操作,这就是job control。
直接将任务丢到后台执行的 &
比如我们把一个大文件备份成services.bz2.bak,且不想前台等待,我们可以这样做:
[root@studyclub ~]# cp services.bz2 services.bz2.bak &
[1] 8760
[1]+ Done cp -i services.bz2 services.bz2.bak
[root@studyclub ~]# tar -jcvf attribute.tar.bz2 attribute/ & # 把打包任务放到后台执行
[1] 17862
[root@studyclub ~]# attribute/
attribute/welcome.sh
attribute/file-del
通过上面的例子我们可以发现打包过程信息还是显示到了当前终端上,如果我们不想让它显示到终端上,可以这样做:
[root@studyclub ~]# tar -jcvf attribute.tar.bz2 attribute/ > /tmp/log.txt 2>&1 &
[1] 8787
上面这个实例就是通过重定向的方式把输出信息写入/tmp/log.txt文件中而不再显示到屏幕上。下面我们详细学习一下重定向到底是什么。
输入输出重定向
先来看个例子:
[root@studyclub ~]# cat bak.sh
#!/bin/sh
# date: 2021年3月17日17:28:56
# Auth: Jason Zhuo
cd /var/www/
tar -jcf /mnt/html_$(date +%F%T).gz html/
[root@studyclub ~]# cat b.sh
cat: b.sh: No such file or directory
格式 | 说明 |
command > file | 将command的标准输出重定向到file中,如果file中本来就有内容,则原有内容会被全部删除 |
command 2> file | 将command的标准错误输出重定向到file中,如果file中本来就有内容,则原有内容会被全部删除 |
command >> file | 将command的标准输出重定向到file中,如果file中本来就有内容,则会追加到原有内容的后面 |
command 2>> file | 将command的标准错误输出重定向到file中,如果file中本来就有内容,则会追加到原有内容的后面 |
command >> file 2>&1 | 将标准输出和错误输出全部重定向到file文件中,如果file中本来就有内容,则会追加到原有内容的后面 |
对于输入重定向一般有以下用法:
格式 | 说明 |
command < file | 把文件作为命令的标准输入 |
command << 结束符 | command从标准输入中读取内容,遇到结束符时停止读取 |
command < file1 >file2 | 把file1作为command的标注输入,并且把执行结果的标准输出重定向到file2 |
下面通过实例来看看上面的输入输出重定向是怎么用的。
# 把帮助信息写入文件
[root@studyclub ~]# rsync --help > rsync_help
# 向readme.txt文件写入内容
[root@studyclub ~]# echo "rsync version 3.1.2 protocol version 31" > readme.txt
# 向readme.txt文件追加内容
[root@studyclub ~]# echo "Web site: http://rsync.samba.org/" >> readme.txt
# 这个时候我们写入了两行内容了,验证一下
[root@studyclub ~]# cat readme.txt
rsync version 3.1.2 protocol version 31
Web site: http://rsync.samba.org/
# 以文件作为命令的输入:统计一下readme.txt里有多少行
[root@studyclub ~]# wc -l < readme.txt # 注意:wc命令就是用来统计字数或行数的命令,wc -l用来统计行数
2
#####################################################################################################
# 查看键盘输入的内容
[root@studyclub ~]# cat << EOF # cat从标准输入读取内容,遇到EOF是停止读取
> #!/bin/bash
> # Date: 2021-6-17
> # Description: print or set the system date and time
> EOF # 输入EOF结束输入
#!/bin/bash # 本行开始为显示结果
# Date: 2021-6-17
# Description: print or set the system date and time
# 我们把上面这个例子改一下,让其把从标准输入获取的内容保存到一个文件中
[root@studyclub ~]# cat << EOF > stdin.txt # 用重定向命令把从标注输入获取的内容保存到stdin.txt文件中。
> #!/bin/bash
> # Date: 2021-6-17
> # Description: print or set the system date and time
> EOF
# 我们把上面这个命令调整一下,看起来更好看
[root@studyclub ~]# cat > stdin.txt << EOF
> #!/bin/bash
> # Date: 2021-6-17
> # Description: print or set the system date and time
> EOF
# 验证一下是不是保存到文件了
[root@studyclub ~]# cat stdin.txt
#!/bin/bash
# Date: 2021-6-17
# Description: print or set the system date and time
新手应知:
《Linux基础及进阶》:
035 - Linux账号管理(7)-身份切换su、sudo
036 - 文件打包与压缩(1)-常见的压缩命令
看完本文有收获?请分享给更多人
推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!
微信号|bjdream-1
Cloud研习社 ·