【实验目的】
熟悉Linux进程管理方法,掌握进程查看命令、进程终止命令,能使用at和cron服务实现Linux进程调度。
【实验内容】
1. 学习常用的进程管理命令;
2. 熟悉Linux中查看进程及进程相关属性、终止进程的方法;
3. 掌握使用at和cron服务启动进程的方法。
【实验准备】
1. 熟悉Linux常用命令以及ubuntu终端操作方法;
2. 熟悉vim等工具的安装和使用。
【实验报告要求】
1. 掌握进程管理中ps、top、kill、killall、jobs、fg、bg等常用命令的用法;
2. 通过命令或编写shell脚本用cron实现对进程的自动启动。
【实验步骤】
一. 熟悉ps、top、kill、killall、jobs、fg、bg这7个命令的用法,完成下面的练习:
1. 启动cat命令并使它在后台运行;
Ctrl+z使进程挂起:
使其在后台运行:
2. 查找所有用户所有进程中包含字符“cat”的进程;
3. 终止名为“cat”的进程,并查看验证是否还存在此进程;
验证,不存在[1]cat进程:
4. 动态显示进程占用cpu及mem的情况,然后【ctrl+c】结束该进程;
5. 运行top命令,按【ctrl+z】挂起该进程;
6. 查看所有后台进程;
7. 将top命令切换到后台运行;
8. 将top命令切换到前台执行。
二. 掌握通过at命令实现计划任务,学习下面at命令的用法,完成相关练习:
要求:分别在5分钟后和3天后统计/etc/passwd文件的行数,将统计结果以追加的方式写入$HOME/passwd文件中;
三. 通过cron进程实现计划任务,学习下面crontab命令的用法,完成相关练习:
从以下网站:完成以下问题:
1.cron、cornd、crontab三者各自的含义是什么,他们之间的关系是什么?
答:
crond的概念和crontab是不可分割的。crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语chronos(χρόνος),原意是时间。而crond正是它的守护进程。(来源Wikipedia)
Linux中,周期执行的任务一般由cron这个守护进程来处理。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“cron table”的简写。(来源网络)
crondtab是一个命令,我们设置的周期性的固定命令是存放在crontab文件中的。
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程。
cron是一种liunx周期性执行设置好时间的固定任务的一种机制。
2.完成上述网站中的例子;
答:
crontab -l //列出当前的所有调度任务
crontab -l -u jp //列出用户jp的所有调度任务
实例:
在当前家目录下创建shell脚本exp5.sh(实现排序)如下:
输入crontab -e 添加计划任务:
在文本最后输入我们要执行的shell脚本命令:
重启cron服务:
#service cron restart
查看结果,用户家目录下查看任务有没有执行,如果执行了应该是有pa.txt文件的(任务有重定向到文件):
3.利用corn机制,完成服务器定时发送到你自己的手机上。请参考下面网页:https://www.jianshu.com/p/7baf423c0579(Python爬虫小白入门(二)--服务器定时发送给邮件给你)
答:
已开启SMTP:
我的mail.py爬虫文件:
写cron脚本文件,命名为crontest.cron。表示,每隔一小时,执行一次爬虫命令 ,并且定向日志为mail.txt:
脚本文件内容:
添加定时任务。执行命令(在此之前先新建一个bs.log存放命令日志):
执行crontab -l查看是否成功添加任务:
等待8小时就有邮件发送到邮箱了~!
四. 附件中“1t_fork.c”和“2t_fork.c”是两个很短的源码文件,根据教材P206~208或者网络资料学习fork函数的原理,完成下面的问题:
- 分析1t_fork.c文件中将输出几个“_”,为什么;
答:
分析会出现6个“_”,但实际出现了8个“_”。
运行结果截图:
但若是这样:
则只会出现6个“_”:
原因在于:printf遇到\n就会输出,并不会在缓冲区停留。所以当printf(“_ \n”)时,当i=0时候,fork后的父进程和子进程即刻输出“_”。随后i=1的时候,fork后的父进程的子进程和父进程拷贝i=0时候的父进程的数据结构和地址空间,同理i=0时候fork的子进程的i=1 fork的父进程和子进程。i=2循环结束,输出结果,所以会输出6个“_”。
当printf(“_”)这种情况时候,i=0时,fork后形成父进程和子进程,此时父进程和子进程的缓冲区内均有“_”。继续循环,i=1,此时i=0时候的父进程和子进程分别再一次fork形成各自的子进程和父进程。它们各自的子进程和父进程将会拷贝一份i=0时的子进程和父进程的缓冲区内容,数据结构,地址空间等。那么,意味着,子进程和父进程的各自子进程和父进程均需要打印两次“_”。此时i=2,循环结束,打印结果,为8个“_”。Wait()函数回收子进程和父进程,避免形成僵尸进程。 - 分析2t_fork.c文件中将输出几个“?”,为什么;
答:
出了个9个“?”。
原因分析:第一次Fork以后,生成了父进程和子进程,继续往下执行。因为没有判别条件,操作系统随机分配资源,父进程和子进程将随机执行语句命令,来进行fork新的子进程和父进程。然后执行printf语句,输出缓冲区内全部的“?”。
五. 附件“实验六.zip”中是教材7.1和7.2节中的源码,请大家在自己机器上编译运行,通过学习教材上对相关函数的描述,思考其输出结果。
答:
1.
函数说明:execl()用来执行参数path 字符串所代表的文件路径, 接下来的参数代表执行该文件时传递过去的argv(0), argv[1], …, 最后一个参数必须用空指针(NULL)作结束。返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中。
打印所有用户当前状态下的进程快照。
2.
execle表示,将环境变量传递给需要替换的进程。
Execlp函数,表示第一个参数path不用输入完整路径,只有给出命令名即可,它会在环境变量PATH当中查找命令。
4.
Execve函数将环境变量传递给需要替换的进程。
执行截图:
5.
Fork函数的三种返回情况,为0则是创建了子进程,打印子进程的PID和返回值。若是为-1则是未能成功创建子进程,fork失败。若是返回值大于零,则代表父进程,返回值为子进程的PID。
6.
Getpid()函数,获得当前进程的PID和当前进程的父进程的ID即PPID。
运行:
【实验总结】
实验过程中碰到的具体问题,怎么解决的?通过这次实验掌握了什么?
答:
通过上网查资料,自己的思考。
https://blog.csdn.net/Lyt15829797751/article/details/78056264 //fork函数