zoukankan      html  css  js  c++  java
  • Linux学习基础篇(进程管理与任务计划)

    1、进程管理

    1.1、进程的概念与分类

    进程,Process,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是在自身虚拟地址空间运行的一个独立的程序,是程序的实体。

    Linux中进程的分类

    1、系统进程:可以执行内存资源分配和进程切换等管理工作的进程,由操作系统启动并管理,这类进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。

    2、用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,这类进程可以在用户的控制下运行或关闭,用户进程具体可分为以下三种

    • 交互进程:由一个shell终端启动的进程,在执行过程中需要与用户进行交互
    • 批处理进程:该进程是一些进程的集合,负责按顺序启动其他的进程
    • 守护进程:守护进程是一种一直运行的进程,通常在系统启动时运行,在系统关闭时终止

    在Linux中,进程ID(PID)是区分不同进程的唯一标识,它的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有进程都是PID为1的进程(使用sysvinit为init进程,使用systemd为systemd进程)的子进程。用PPID表示进程的父进程。

    1.2、进程的管理

    1.2.1、ps命令

    ps命令可查看进程在瞬间的运行状态,常见的组合有ps -ef和ps -aux,命令详细使用查看另一篇博客https://www.cnblogs.com/yu2006070/p/9243328.html。这里补充一点,使用该命令查看的显示信息中,用中括号括起来的进程一般为系统进程;另外系统进程都排列在前面,因为系统进程早于用户进程启动。

    1.2.2、top命令

    top命令用于实时查看进程系统占用状况,详细使用查看博客https://www.cnblogs.com/yu2006070/p/9243328.html。这里补充一点,在top显示界面下,按f键可修改top命令显示的列信息。

    1.2.3、lsof命令

    lsof命令可以用于列出进程打开的文件,命令语法如下:

    lsof [选项]

    常用选项:

    • -p PID:显示进程打开的所有文件
    • -c 进程名:显示进程打开的所有文件
    • -i [tcp/udp]:端口号:通过监听指定的协议、端口号等信息,显示符合条件的进程
    • -u UID:列出UID号进程详情
    • -g GID:列出GID号进程详情

    命令执行结果详解:

    lsof 1

    通过该命令还可以看到连接情况:

    lsof 2

    lsof命令一般用于查看进程占用的文件数,因为Linux对于每个进程打开的文件数量有限制,如果超出了最大文件数,会导致进程异常。

    1.2.4、pgrep命令

    pgrep命令用于通过程序名查询进程PID,它通过检查程序在系统中活动的进程,输出进程属性匹配指定条件的进程ID,命令语法如下:

    gprep [选项] 程序名

    常用选项:

    • -o:仅显示找到的最小(起始)进程号
    • -n:仅显示找到的最大(结束)进程号
    • -l:显示进程名称
    • -f:使用完成的进程名匹配

    1.2.5、kill命令

    kill命令用于根据PID杀死一个进程,命令语法如下:

    kill [信号类型] PID

    信号类型:信号类型决定了kill如何结束一个进程,通过kill –l可以查看所有的信号类型。常用的信号类型有

    • SIGKILL,9,强制结束进程
    • SIGTERM,15,正常结束进程,kill的缺省选项
    • SIGINT,2,结束进程,但并不是强制性的,通过ctrl+c发出的就是一个kill -2信号

    特殊的:kill –0,用于对进程进行试探,检测该进程是否存在及运行。

    1.2.6、killall命令

    killall命令用于根据进程名杀死一个或一组进程,命令语法如下:

    killall [信号类型] 进程名

    这里的信号类型同kill命令。

    2、Linux下的任务计划

    2.1、crond的概念和分类

    crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与Windows下的任务计划类似。

    Linux下的任务调度分为两类,系统任务调度和用户任务调度。

    系统任务调度:系统所要执行的周期性工作,如将缓存写入硬盘、日志清理等。系统任务的配置文件为/etc/crontab以及以下目录中的文件/etc/cron.d、/etc/cron.daily、/etc/cron.hourly、/etc/cron.monthly、/etc/cron.weekly

    用户任务调度:用户定期要执行的任务。用户可以使用crontab工具来定制自己的任务计划。用户定义的crontab文件保存在/var/spool/cron目录下,以用户名命名。

    2.2、使用crontab工具

    crontab命令语法如下:

    crontab [-u 用户] [文件]|[选项]

    参数含义:

    • -u:用来设定某个用户的任务计划,此参数一般由root运行,不指定该参数则为当前用户的任务计划
    • 文件:命令文件,表示将该文件作为crontab的任务列表并载入crontab。如果在没有指定该文件,crontab将接收标准输入上键入的命令

    常用选项:

    • -e:编辑用户的crontab文件
    • -l:显示用户的crontab文件内容
    • -r:从/var/spool/cron目录中删除用户的crontab文件
    • -i:在删除用户的crontab文件时需要确认

    2.3、crontab文件格式

    用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式分为六个字段,前五个字段为时间设定字段,第六个字段为要执行的命令,具体格式如下:

    minutes hour day month week command

    • minutes:分钟,可以是从0到59之间的任何整数
    • hour:小时,可以是从0到23之间的任何整数
    • day:日期,可以是从1到31之间的任何整数
    • month:月份,可以是从1到12之间的任何整数
    • week:星期,可以是从0到7之间的任何整数,这里的0或7代表星期日
    • command:执行的命令,可以是系统命令,也可以是编写的脚本

    以上的各个字段中,还可以使用以下特殊字符:

    • *:代表所有的值
    • ,:用逗号隔开的值指定一个列表,如1,3,5
    • -:表示一个整数范围,如2-6表示从2到6的几个数
    • /:指定时间的间隔频率,如minutes字段的*/3表示每三分钟执行一次

    一些例子:

    # 在每天的3点执行/data/run.sh
    0 3 * * * /data/run.sh
    
    # 每个三个小时执行一次/data/run.sh
    0 */3 * * * /data/run.sh
    
    # 在每周五的凌晨三点半执行/data/run.sh
    30 3 * * 5 /data/run.sh

    crontab执行任务的日志存储在/var/log/cron文件中,可以通过查看该日志检验任务是否正常执行。

    2.4、crontab使用中的注意事项

    环境变量导致任务无法执行

    手动执行任务不存在问题,但是无法自动执行任务,这种情况一般是crontab文件中没有配置环境变量引起,可以在crontab文件中添加source 环境变量配置文件来指定加载的环境变量。如:

    加载xxx用户的环境变量

    #crontab文件中添加
    source /home/xxx/.bashrc

    清理用户的邮件日志

    当命令在后台运行时,如果该命令有输出,则会通过邮件形式输入到邮件日志中,邮件日志位于/var/mail目录中,每个用户由以用户名命名的文件,如果任务运行时一直往该日志中发送信息,则会导致日志文件体积增大,可以使用以下方法忽略任务的日志输出:

    minutes hour day month week command>/dev/null 2>&1

    系统级任务与用户级任务

    用户级的任务可以放到系统级任务调度中完成,但是系统级的任务无法使用用户级来调度。

  • 相关阅读:
    读入输出优化
    【JSOI2008】星球大战 并查集
    堆STL和重载运算符
    树的直径
    H3C三层交换机(S5500)清除配置信息并进行简单配置
    简单的逻辑学
    Java基础--第十八天
    Java基础--第十七天
    Java基础--第十六天
    Java基础--第十五天
  • 原文地址:https://www.cnblogs.com/yu2006070/p/9327430.html
Copyright © 2011-2022 走看看