一、实验目的
1、熟悉Linux操作系统环境,掌握Linux命令的一般格式; 2、掌握进程的概念,进程及作业相关的操作命令; 3、掌握查看系统信息的方法。
二、实验环境:
一台运行GNOME图形用户界面的任意一种Linux操作系统的计算机。(Centos7)
三、实验内容与步骤
PART 1 进程基本操作
-
查看当前所有进程。 -
查看当前进程树,找出ps进程的父进程是哪个进程。 ps进程的父进程为bash 或者通过pstree命令从进程树中找到pstree进程的父进程(由于没有使用ps命令,没有产生ps进程,在使用pstree时找不到ps进程,所以只能找pstree的父进程了) -
查看进程树,在进程树中显示进程ID。 -
杀死bash进程,观察结果。 将bash进程杀死后从管理员切换到了普通用户,如果是普通用户杀死bash进程则退出终端 -
在终端窗口,以前台方式启动vi,编辑一个文本文件,文件名自定:vi 文件名 -
将vi进程切换到后台。 -
分别查看进程列表,工作列表。 -
将刚才切换到后台的vi进程切换到前台。 -
退出vi。 在命令模式下输入:q -
在后台查找根目录下所有比/etc/man_db.conf新的文件,并将结果存储到result.txt中。 -
查看工作列表,是否有find在执行。 -
等待find工作结束,查看工作列表,还有find在执行吗 13.查看result.txt文件的内容。
太多了就只看了前面的10行 (查看全部可以使用cat result.txt 或者 vi result.txt)
PART 2 进程管理
-
编写一个C程序,程序名为running.c,主函数中包含一个无法正常终止的循环,如: int main(int argc,char **argv) { printf(“The program is running.\n”); while (1) { } return 0; } -
编写一个C程序,程序名为waitkey.c,主函数中包括一个输入语句,等待用户输入一个数据,代码自己写。 -
分别在两个终端窗口,运行上述两个程序,waitkey程序运行到输入数据语句时,暂时不 输入。 ./running 执行第一个程序,使用ctrl+T打开另一个终端窗口 ./waitKey执行第二个程序(先使用gcc running -o running进行编译) -
打开第三个终端窗口,用ps命令查看系统中进程,观察上述两个程序的进程状态。 -
在waitkey程序运行窗口输入数据,程序结束,在第三个终端窗口用ps命令查看系统中进程。 -
在第三个终端窗口,将running程序对应的进程杀掉,再观察系统中进程。
PART 3 定时执行命令
- 在指定时间(自己设定,如下午17:00,上午10:00等),找出系统中所有以.c为后缀的文件,将结果保存至/etc/information.txt文件中,并向某用户(自己指定)发信息告知已完成上述工作,信息内容自定。
- 启动crond服务:service crond restart
- 建立一个cron作业列表文件,文件名为cronfile_1,内容如下:
33 10 * * * ls /etc 34 10 * * * who 35 10 * * * ps 说明:前两列对应的为时间,分,小时,为便于观察实验结果,可以根据自己的实际实验时间进行调整,。上述文件内容表示10点33分执行命令ls /etc,10点34分执行命令who,10点35分执行命令ps
- 安装crontab文件,命令为:crontab cronfile_1
(这里我的文件名是cronWork)
-
用命令查看计划任务表:crontab –l -
计划列表中的任务是以前台方式还是后台方式运行
cron是一个守护进程,是个标准的后台服务程序
- 当收到邮件通知时,查看邮件信息
由于当时没有设定发送用户,又是在root下运行,邮件都发给了root用户,我没有收到邮件提示,主动到root的邮箱进行查看: (查看root的邮件方式:①使用su - 进入root账号和环境,输入mail查看;②进入邮箱目录:cd /var/spool/mail 在这里可以看到所有用户的邮箱(应该是),然后可以cat root就可以看到他的所有信息,但是如果信息很多就可能看不过来;③在上个条件下,进入到mail目录,使用命令mail -f root(指定邮箱名)可以查看到root的邮箱内容(推荐第三种))
PART 4 守护进程
- 在自己的工作目录下,建立一个c源文件,文件名自定,如daemon.c
文件内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
int init_daemon(void)
{
pid_t pid;
int i;
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP,SIG_IGN);
umask(0);
if((pid=fork())>0)
exit(EXIT_SUCCESS);
else if(pid<0)
{
perror("fork");
exit(EXIT_FAILURE);
}
setsid();
for(i=0;i<NOFILE;i++)
close(i);
open("/dev/null",O_RDONLY);
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
chdir("/");
signal(SIGCHLD,SIG_IGN);
return 0;
}
int main(int argc,char * argv[])
{
FILE *fp; time_t t;
int i;
init_daemon();
for( i=1;i<=20;i++)
{ sleep(3);
if((fp=fopen("test.log","a")) >=0)
{ t=time(0);
fprintf(fp,"Im here at %s\n",asctime(localtime(&t)));
fclose(fp);
}
}
}
截图太长了,只截取了一部分
- 阅读以上程序,读懂代码,观察运行结果。
该函数主要作用是建立一个后台程进程,将/(根目录)设置为默认路径,如果没有test.log文件就创建一个这个文件,并每隔3秒向该文件写入固定格式的程序时间,重复20次。
运行结果:
- 将以上程序主函数进行修改,功能为:在\tmp目录下建立一个文件,文件名为data.txt,对指定目录下的文件进行统计(指定目录可以在程序中直接给出),每隔2分钟,将指定目录下的文件数量写入文件data.txt中,写3次。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <dirent.h>
int init_daemon(void)
{
pid_t pid;
int i;
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP,SIG_IGN);
umask(0);
if((pid=fork())>0)//是父进程,结束父进程,子进程继续,为避免挂起控制终端将Daemon放入后台执行
exit(EXIT_SUCCESS);
else if(pid<0)
{
perror("fork");
exit(EXIT_FAILURE);
}
setsid();
for(i=0;i<NOFILE;i++)
close(i);
open("/dev/null",O_RDONLY);
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
chdir("/tmp");//change this file be default file
signal(SIGCHLD,SIG_IGN);
return 0;
}
int main(int argc,char * argv[])
{
FILE *fp; time_t t;
int i;
DIR *dp;
struct dirent *filename;
init_daemon();
for( i=0;i<=3;i++)//执行次数
{
countOfFiles = 0;//初始化文件数量
sleep(120);//执行间隔120秒
if((fp=fopen("data.txt","a")) >=0)
{
dp = opendir("/home/student"); //指定读取的目录
if(!dp){ //目录打开异常输出
fprintf(fp,"open dir error!\n");
}
while(filename = readdir(dp)){ //读取该目录下的所有文件
fprintf(fp,"files : %s\n",filename->d_name);//文件名写入
}
fprintf(fp,"the number of files:%d\n",countOfFiles);//数量写入
fclose(fp);
closedir(dp);
}
}
return 0;
}
运行结果截图:
参考资料连接: https://blog.csdn.net/dream_allday/article/details/75243818 http://c.biancheng.net/cpp/html/238.html https://blog.csdn.net/vblittleboy/article/details/8593067 https://www.runoob.com/cprogramming/c-function-signal.html https://blog.csdn.net/zhuyi2654715/article/details/7540759 https://www.runoob.com/w3cnote/c-time-func-summary.html https://www.runoob.com/cprogramming/c-function-fprintf.html
|