查看原文
其他

进程管理与计划任务(1)-进程管理与job control

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新,我们不见不散!



进程管理


程序(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    # 这个是新启动的进程,我们可以看到PPID16486,即父进程号是16486,即我们执行bash命令的那个终端
0 R     0  16932  16921  0  80   0 - 38309 -      pts/0    00:00:00 ps


常驻内存的进程常驻内存的进程叫守护进程daemon。例如我们常见的sshd进程、nfsd进程、crond进程中,这些进程无论你是否需要它,他都在那里运行着,时刻准备着为你服务。


job control


为了在一个bash里执行多个任务。需要把运行时间长的任务放到后台运行,以保证前台可以正常操作,这就是job control。

直接将任务丢到后台执行的 &

比如我们把一个大文件备份成services.bz2.bak,且不想前台等待,我们可以这样做:


[root@studyclub ~]# cp services.bz2 services.bz2.bak &
[1] 8760


我们看到,在命令的最后加入“&”符号就可以把任务放到后台执行,前台无需等待。你可以继续在当前终端继续执行其他命令。上面输出结果的格式为:[job number] pid。在中括号内的号码为任务号码 (job number),该号码与 bash 的控制有关。后续的 8760 则是这个任务在系统中的 PID。那么丢到后台中的任务什么时候完成?完成的时候会显示什么?如果你输入几个命令后,突然出现这个数据:


[1]+ Done                    cp -i services.bz2 services.bz2.bak


就代表 [1] 这个任务已经完成 (Done) ,后面的cp命令就是实际发起这个已经完成的任务的指令。然后我们再来看一个例子:


[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


上面查看bak.sh文件的内容和b.sh的内容,前者执行成功,返回的是标准输出,后者执行失败,返回的是标准错误输出。标准输入:STDIN,数字表示法是0,默认是键盘输入,为0的时候表示从其他文件或命令输入标准输出:STDOUT,数字表示法是1,默认输出到屏幕,为1的时候表示文件标准错误输出:STDERR,数字表示法是2,默认输出到屏幕,为2的时候表示文件对于输出重定向一般有以下用法:
格式说明
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




新手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    035 - Linux账号管理(7)-身份切换su、sudo

    036 - 文件打包与压缩(1)-常见的压缩命令

    037 - 文件打包与压缩(2)-打包命令tar
    038 - 文件打包与压缩(3)-xfs文件系统的备份与还原
    039 - 文件打包与压缩(4)-dd命令详解


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存