首页 > 代码库 > 入手内核的前篇之进程和计划任务

入手内核的前篇之进程和计划任务

概念的介绍
 
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等。
 
进程,在linux系统中,触发一个事件时,系统都会将它定义成一个进程,并且给进程一个ID我们称之为PID,也就是进程号,这个进程创建与之能使用的权限和功能也和创建者有关。
 
在CentOS 7以前的第一个进程是init
[root@magedu6 ~]# pstree               #以进程树的形式显示当前进程
init─┬─NetworkManager─┬─dhclient
     │                └─{NetworkManager}
     ├─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     ├─automount───4*[{automount}]
....

而在CentOS 7上第一个进程是systemd

systemd─┬─NetworkManager─┬─2*[dhclient]
        │                └─2*[{NetworkManager}]
        ├─auditd───{auditd}
        ├─automount───4*[{automount}]
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─login───bash
        ├─master─┬─pickup
        │        └─qmgr
...

Process:  运行中的程序的一个 副本,是被 载入内存的一个指令集合
进程ID (Process ID ,PID )号码被用来标记各个进程
UID 、GID 、和SELinux 语境决定对文件系统的存取和 访问权限,
通常 从执行进程的 用户来继承
存在生命周期
task struct :Linux 内核存储进程信息的数据结构格式
task list :多个任务的的task struct 组成的链表

进程:都由其父进程创建,CoW #CoW写时复制技术
fork(), clone()

过程这样的

1、系统先以fork的方式复制一个与服进程相同的进程,这个进程与服进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别PID。

2、然后新产生的进程开始加载实际要运行的程序进行执行。#只有进行写入操作的时候才会这样。

进程间通信

  1.主机上的进程通信可以通过signal(信号指令)、shm(共享内存空间)、semerphor(旗语)

  2.两个主机间的通信通过rpc(远程过程调用)、socket(套接字)

进程优先级:
  系统优先级: 数字越小,优先级越高
    0-139 (CentOS4,5) )
      各有140 个运行队列和过期队列
    0-98 ,99 (CentOS6) )
  实时优先级: 99-0 :值最大优先级最高
  nice 值:-20 到19 ,对应 系统优先级100-139 或99
Big O :时间复杂 度 ,用时和规模 的 关系
  O(1), O(logn), O(n) 线性, O(n^2) 抛物线, O(2^n)

进程内存
Page Frame:页框,用存储页面数据,存储Page 4k
LRU :Least Recently Used 近期最少使用算法,释放内存
物理地址空间和线性地址空间,实际使用叫物理空间
MMU :Memory Management Unit 负责转换线性和物理地址
TLB:Translation Lookaside Buffer 翻译 后备 缓冲器, 用于保存虚拟地址和物理地址映射关系的缓存 #你实际使用多少,但给你多少
IPC: Inter Process Communication
同一主机: signal: 发信号
shm: shared memory 共享内存 #两个进程要通信,他们会创建个共享内存来通信
semaphore: 信号量,一种计数器 #当你使用一个程序调用一个进程,你会给个标记表示你在使用,这样其他进程无法再次调度。
不同主机:rpc: remote procedure call #远程过程调用 当你程序使用的时候需要使用B程序调用下,调用完后返回A进程
socket: IP #unix套接字文件实现

进程状态

    linux内核:抢占式多任务 #在以前操作系统中是协作式多任务,意思是一个任务得到了CPU时间,除非它自己放弃使用CPU,否则将完全霸占CPU,而抢占式多任务系统的控制权在操作系统这,操作系统会轮询的问每个任务是否需要CPU的使用权,而过一段时间后会收回CPU使用权,将它放在最后,在去询问下一个任务,这样的好处是不会造成任务锁死

进程类型:
守护进程: daemon, 在系统引导过程中启动的进程, 和 终端无关进程
前台进程:跟终端相关,通过终端启动的进程
#两者可相互转换
 
进程状态:
运行态:running
就绪态:ready #等待CPU时间片 调用
睡眠态:
可中断:interruptable
不可中断:uninterruptable #比如IO操作文件,没有读取完你不能中断
停止态:stopped, 暂停于内存,但不会被调度,除非手动启动 #当你用VI编辑的时候就是这个状态
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
  一些命令的使用。  
系统管理工具
进程的分类:
CPU-Bound :CPU 密集型,非交互 比如查找计算 排序,对CPU占用率高的进程
IO-Bound :IO密集型,交互 。等待I/O时间长的进程 #dd之类的命令
Linux 系统状态的查看及管理工具:pstree, ps, pidof,
pgrep, top, htop, glance, pmap, vmstat, dstat, kill,
pkill, job, bg, fg, nohup
pstree 命令:
pstree - display a tree of processes
ps: process state
ps - report a snapshot of the current processes
Linux 系统各进程的相关信息均保存在/proc/PID 目录下的各文件中。  
列举进程ps
支持三种选项:
UNIX 选项 如 如-A -e

[root@localhost ~]# ps -A -e #-A和 -e 效果是一样的。 PID TTY TIME CMD 1 ? 00:00:03 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:02 ksoftirqd/0 7 ? 00:00:00 migration/0 8 ? 00:00:00 rcu_bh
BSD 选项 如 如a

[root@localhost ~]# ps a PID TTY STAT TIME COMMAND 2180 tty1 Ss+ 0:00 -bash 6810 pts/0 Ss 0:00 -bash 7231 pts/0 R+ 0:00 ps a
GNU 选项 如 如--help
...
常用组合:-ef
-e: 显示所有进程
-f: 显示完整格式程序信息
常用组合:-eFH
-F: 显示更完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
常用组合:自定义
-eo pid,tid,class,rtprio(优先级),ni,pri,psr,
pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid, #挑一些显示,多个选项用逗号隔开
pid,pcpu,comm,cmd
euid:有效用户
      ruid:实际用户执行命令的人
这三种选择一种适合自己的就好。
 
top命令类似windows下的任务管理器
一些常用指令
选项说明
-d 指定每两次屏幕信息刷新之间的时间间隔
-i 不显示限制或者僵死的进程信息
-c 显示进程的整个命令路径,而不是只显示命令名称
-s 使top命令在安全模式下运行。此时top的交互式指令被取消,避免潜在危险
-b 分屏显示输出信息,结合“-n”选项可以将屏幕信息输出到文档
-n top输出信息更新的次数,完成后将退出top命令

 还有一些交互式命令      

top :有许多内置命令:
排序:
P :以占据的CPU 百分比,%CPU
M :占据内存百分比,%MEM
T :累积占据CPU 时长,TIME+
 
首部信息显示:
uptime 信息:l 命令
tasks 及cpu 信息:t 命令
cpu 分别显示:1 ( 数字) #可以显示具体每个CPU情况
us :用户空间
sy :内核空间
ni :调整nice 时间
id :空闲
wa :等待IO 时间
hi :硬中断 #硬件资源操作
si :软中断(模式切换)进程切换
st :虚拟机偷走的时间
memory 信息:m 命令 #内存信息
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W #存在家目录下 .toprc
技术分享
top输出分为统计信息区和进程信息区两个部分,
1)统计信息区
  • 01:34:10:表示当前系统时间。
  • up 14:20:表示系统已经运行的时间
  • 2 users:当前登录系统的用户数
  • load average :表示系统平均负载,三个数值分别表示1分钟 5分钟 15分钟到现在的系统平均负载值。

第二行和第三行分别是进程和CPU信息

  • Tasks:113 total:进程的总数。
  • 2 running:正在运行的进程。
  • 111 sleeping:处于休眠状态的进程。
  • 0 stopped:停止的进程数。
  • 0 zombie:僵死的进程数。
  • %Cpu(s):0.0us:表示用户进程占用CPU的百分比。
  • 0.3 sy:系统进程占用CPU的百分比。
  • 0.0 ni:用户进程空间内改变过优先级的进程占用CPU的百分比。
  • 99.7 id:空闲CPU占用的百分比。
  • 0.0 wa:等待输入、输出的进程占用CPU的百分比。

最后 两行输出的是内存信息

  • KiB Mem:483856 total:系统的物理内存大小。
  • 64972 free:目前空余内存大小。
  • 115984 used:已经使用的物理内存大小。
  • 302900 buff/cache:用作内核缓冲区的内存大小。
  • KiB Swap:2097148 total:交换分区内村大小。
  • 2096352 free:空闲的交换分区大小。
  • 796 used:已经使用的交换分区大小。
  • 309652 avail Mem:缓存大小。

进程信息区

进程信息区显示了每个进程的运行状态,我们先来看一下每列输出的含义。

  • PID:进程的ID。
  • USER:进程所有者的用户名。
  • PR:进程优先级。
  • NI:nice值。负值表示高优先级,正值表示低优先级。
  • VIRT:进程使用的虚拟内存总量,单位KB. VIRT=SWAP+RES。
  • RES:进程使用的、未被患处的物理内存大小,单位KB。RES=CODE+DATA,其中,CODE为执行代码占用的物理内存大小,DATA为数据占用的内存大小。
  • SHR:共享内存大小,单位KB。
  • S:进程状态,D表示不可终端的睡眠状态,R表示运行状态,S表示睡眠状态,T表示跟踪/停止,Z表示僵死进程。
  • %CPU:上次更新到现在的CPU时间占用百分比。
  • %MEM:进程占用的物理内存百分比。
  • TIME+:进程总计使用的CPU时间,单位为1/100秒。
  • COMMAND:正在运行进程的命令名或者命令路径。
 
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice 值为0 ,优先级为120
只有根用户才能降低nice 值(提高优先性)
nice 命令:
nice [OPTION] [COMMAND [ARG]...]
nice -n 10 ping 127.0.0.1 #指定优先级运行
特殊用法:nice --6 d if=/dev/zero of=/dev/null
renice 命令: #能根据PID修改优先级
renice [-n] priority pid...
查看:
ps axo pid,comm,ni
 
 
搜索进程
最灵活:ps 选项 | 其它命令
按预定义的模式:pgrep
pgrep [options] pattern
-u uid: effective user ,生效者
-U uid: real user ,真正发起运行命令者
-t terminal: 与指定终端相关的进程
pgrep -lt pts/1
-l: 显示进程名
-a: 显示完整格式的进程名 #centos 7上才有的选项
-P pid: 显示指定进程的子进程
按确切的程序名称:/sbin/pidof
pidof bash #查看进程编号,这个命令是软链接,但是链接对象你不能用
 
 
一个进程可以拥有多个线程,但线程不能单独存在。
一个进程里多个线程之间的资源是共享的,线程消耗资源是很少的
 
uptime
显示当前时间,系统已启动的时间,也能显示负载情况。load Average 1 5 10分钟内的负载
一个CPU内核当前活动进程数不大于3,表示正常,超过5系统性能就有问题。
 
#脚本里第一行不写bash 执行的是命令,你用ps aux | grep f1.sh #会搜索不到
vmstat 命令:虚拟内存信息
vmstat [options] [delay [count]]
vmstat 2 5
procs:
r :可运行(正运行或等待运行)进程的个数,和核心数有关
b :处于不可中断睡眠态的进程个数( 被阻塞的队列的长度)
memory: :
swpd: 交换内存的使用总量
free :空闲物理内存总量
buffer :用于buffer 的内存总量
cache :用于cache 的内存总量
swap:
si :从磁盘交换进内存的数据速率(kb/s)
so :从内存交换至磁盘的数据速率(kb/s)
io:
bi :从块设备读入数据到系统的 速率(kb/s)
bo: 保存数据至块设备的 速率
system:
in: interrupts 中断速率,包括时钟
cs: context switch 进程切换速率
cpu:
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41 前, 包括IO-wait time.
wa: Time spent waiting for IO. 2.5.41 前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11 前, unknown.
选项:
-s: 显示内存数据

[root@localhost ~]# vmstat 1 3 #一秒显示依次,3次后结束 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 1340 90868 0 253020 0 0 5 4 40 53 0 0 100 0 0 0 0 1340 90852 0 253020 0 0 0 0 122 173 0 1 99 0 0 0 0 1340 90852 0 253020 0 0 0 0 121 164 0 0 100 0 0 [root@localhost ~]#
iostat: 统计CPU 和设备IO 信息
示例:iostat 1 10
pmap 命令:进程对应的内存映射
写数字表示进程号,然后看内存映射信息
/proc/1/masp #地址
pmap [options] pid [...]
-x: 显示详细格式的信息
示例:pmap 1
另外一种实现:
cat /proc/PID/maps
技术分享
[root@localhost ~]# cat /proc/1/maps 
7fd420000000-7fd420029000 rw-p 00000000 00:00 0 
7fd420029000-7fd424000000 ---p 00000000 00:00 0 
7fd42778b000-7fd42778c000 ---p 00000000 00:00 0 
7fd42778c000-7fd427f8c000 rw-p 00000000 00:00 0 
7fd427f8c000-7fd427f8d000 ---p 00000000 00:00 0 
7fd427f8d000-7fd42878d000 rw-p 00000000 00:00 0 
7fd42878d000-7fd428791000 r-xp 00000000 fd:00 67235606                   /usr/lib64/libuuid.so.1.3.0
7fd428791000-7fd428990000 ---p 00004000 fd:00 67235606 


[root@localhost ~]# pmap 1
1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 21
00007fd420000000    164K rw---   [ anon ]
00007fd420029000  65372K -----   [ anon ]
00007fd42778b000      4K -----   [ anon ]
00007fd42778c000   8192K rw---   [ anon ]
00007fd427f8c000      4K -----   [ anon ]
00007fd427f8d000   8192K rw---   [ anon ]
00007fd42878d000     16K r-x-- libuuid.so.1.3.0
00007fd428791000   2044K ----- libuuid.so.1.3.0
View Code

dstat 命令:系统资源统计, 代替vmstat,iostat dstat [
-afv] [options..] [delay [count]] -c: 显示cpu 相关信息 -C #,#,...,total -d: 显示disk 相关信息 -D total,sda,sdb,... -g :显示page 相关统计数据 -m: 显示memory 相关统计数据 -n: 显示network 相关统计数据 -p: 显示process 相关统计数据 -r: 显示io 请求相关的统计数据 -s: 显示swapped
kill 命令:
向进程发送控制信号,以实现对进程管理, 每个信号对应一个数字,
信号名称以SIG 开头(可省略 ), 不 区分大小写
显示当前系统可用信号: kill –l,trap -l
常用信号:man 7 signal
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
3) SIGQUIT: 相当于ctrl+\
9) SIGKILL: 强制杀死正在运行的进程 #不是什么进程都能杀死比如bash
15) SIGTERM :终止正在运行的进程 #默认是15,有的进程这么杀不死
18) SIGCONT :继续运行
19) SIGSTOP :后台休眠
#如果在后台运行的程序,用它也能进行休眠
指定信号的方法:
(1) 信号的数字标识:1, 2, 9
(2) 信号完整名称:SIGHUP (3) 信号的简写名称:HUP
 
按PID :kill [-SIGNAL] pid …
kill –n SIGNAL pid;kill –s SIGNAL pid
按名称:killall [-SIGNAL] comm…
按模式:pkill [options] pattern
-SIGNAL
-u uid: effective user ,生效者
pkill -9 -u wang
-U uid: real user ,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程 名(pgrep 可用)
-a: 显示完整格式的进程 名( (pgrep 可用)
-P pid: 显示指定进程的子进程
 
 
Linux 的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台
(1) 运行中的作业: Ctrl+z
送到后台并休眠
(2) 尚未启动的作业:# COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭
后台作业。如果希望送往后台后,剥离与终端的关系
 
nohup COMMAND & #screen;COMMAND
送到后台运行不与终端有关
默认是有输出的,可以重定向到垃圾箱
nohup.out #结果这个文件下会有
screen #新开终端,跟sshd没关系
-ls 查看会话
 
 
查看当前终端所有作业:
jobs #这个只能在当前终端看当前终端的后台运行进程
后台两种状态
运行:
休眠:stop
作业控制:
fg [[%]JOB_NUM] :把指定的后台作业调回前台
bg [[%]JOB_NUM] :让送往后台的作业在后台继续运行
kill [%JOB_NUM]: 终止指定的作业
kill %1 #结束编号作业,需要用jobs先查看
 
对于任务的加速完成
 
f1.sh;f2.sh;f3.sh #这是顺序执行达不到效果
同时运行多个进程,提高效率
方法1 #必须放入后台执行
vi all.sh
f1.sh&
f2.sh&
f3.sh&
方法2
(f1.sh&);(f2.sh&);(f3.sh&) #会开子进程
方法3
{ f1.sh& f2.sh& f3.sh& }
 
 
#at命令如果时间过了,会明天去执行
包:at
at 命令:at [option] TIME
常用选项:
-V 显示版本信息:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile :从指定的文件中读取任务
-m: 当任务 被完成之后,将给用户发送邮件,即使没有标准输出
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
TIME: 定义出什么时候进行 at 这项任务的时间
HH:MM [YYYY-mm-dd]
20:20 2016-10-10
noon, midnight, teatime (4pm) #英文单词也能用
tomorrow #明天
now+#{minutes,hours,days, OR weeks}
at now+10minutes #10分钟后自动执行
 
HH:MM 02:00 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 02:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
02pm + 3 days
 
执行方式:
1)交互式 )输入重定向 3 )at –f 文件
依赖与atd 服务, 需要启动才能实现at 任务
at 队列存放在/var/spool/at 目录中
/etc/at.{allow,deny} 控制用户是否能执行at 任务
白名单:/etc/at.allow 默认不存在,只有该文件中的用户
才能执行at 命令
黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行
at 命令, 而没有在 在at.deny 文件中的使用 者则可执行
如果 两个文件都不存在有 ,只有 root 行 可以执行 at
/etc/at.deny
wang
mage
/etc/at.allow
#这个两个用户会因为写入这个文件而不能执行。
#如果两个文件都写了该用户。白名单权限更高。设置白名单后,一切以白名单为主,如果这两个文件都没有,除了root全部拒绝
例:
技术分享
[root@magedu6 ~]# cat /etc/rc.d/init.d/atd   #命令状态确认 CentOS 6
#!/bin/sh
#
# atd Starts/stop the "at" daemon
#
# chkconfig:   345 95 5
# description: Runs commands scheduled by the "at" command at the time #    specified when "at" was run, and runs batch commands when the load #    average is low enough.
...省略
[root@magedu6 ~]# runlevel #确认是否启动
3 5

[root@magedu6 ~]# service atd status   #查看当前状态
atd (pid  1913) 正在运行...

[root@magedu6 ~]# chkconfig --list atd
atd             0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

[root@localhost ~]# cat /lib/systemd/system/atd.service  #CentOS 7上的状态确认
[Unit]
Description=Job spooling tools
After=syslog.target systemd-user-sessions.service

[Service]
EnvironmentFile=/etc/sysconfig/atd
ExecStart=/usr/sbin/atd -f $OPTS
...
 
[root@localhost ~]# systemctl is-enabled atd   #确认开机是否启动
enabled

[root@localhost ~]# systemctl status atd.service  #  #确认是否启动,.service可以省略
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: inactive (dead)


[root@localhost ~]# at 09:28    #默认交互模式,echo这类终端打印 命令没打印的原因是他以邮件方式发送给root。只要标准输出命令都要输出到/dev/null避免太多垃圾邮件
at> echo at is starting
at> <EOT>
job 3 at Wed May 10 09:28:00 2017

[root@localhost ~]# at -l     #可以看到没执行的计划任务,相当于atq命令
2       Wed May 10 09:24:00 2017 a root
3       Wed May 10 09:28:00 2017 a root

at命令关机也不会丢  因为会放在 /var/spool/at/... 文件里

[root@localhost ~]# getent passwd daemon   #系统用户,查看情况
daemon:x:2:2:daemon:/sbin:/sbin/nologin
View Code
at -d 4 #删除4这个计划任务
atrm 5 #删除计划任务5
at -c 7 #查看具体情况,就是看/var/spool/at这个文件
at -f atjob #直接调用文件 和sed -f 里的效果差不多。
at -m 14:34
touch 1.log  
周期性任务计划:cron
相关 的程序包:
cronie: 主程序包,提供crond 守护进程及相关辅助工具
cronie-anacron :cronie 的补充 程序,用于 监控cronie任务执行 状况,如cronie 中的任务在过去该运行的时间点未能正常运行,则anacron 会随后启动一次此任务。
crontabs :包含CentOS 提供系统维护任务
 
chkconfig --list crond #查看启动没有
service crond status #查看启动没有
systemctl status crond #7上查看启动没有
/usr/sbin/crond #真正的程序在这
/var/spool/cron #你做的计划任务会在这
 
确保crond 守护处于运行状态:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
计划周期性执行的任务提交给crond ,到指定时间会自动运行
系统cron 任务:系统维护作业
/etc/crontab
用户cron 任务:
crontab 命令
日志:/var/log/cron
 
时间表示法:
(1) 特定值
给定时间点有效取值范围内的值
(2) *
给定时间点上有效取值范围内的所有值
表示“每...”
(3) 离散取值
#,#,#
4) 连续取值
#-#
(5) 在指定时间范围上,定义步长
/#: # 即为步长
 
@reboot Run once after reboot.
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
示例:每3 小时echo 和wall 命令
0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall
“welcome to Magedu!
 
 
系统cron 任务:/etc/crontab
注释行以 # 开头
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR
sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
例如:晚上9 点10 分运行echo 命令
10 21 * * * centos /bin/echo "Howdy!"
#写计划任务的时候必须写明确路径让文件知道在哪找,因为不一定用一个shell。
例:
30 2 1-10,20-25 root /bin/touch /app/cron.log #写普通用户也行,但普通用户不一定有资格
* #*代表每分钟
cp -a /etc/ /paa/etcbak-`date +%F`/ #复制一个文件,因为有%所以不会成功
* * * * * root cron.sh #写入脚本调用就好,最后两个*是或,其他三个是并且。如果想实现并且,就脚本里写。
@reboot root touch /app/reboot.log #重启后执行
 
/var/spool/cron/ #用命令创建的才放到这里,文件里写入不存在
 
系统的计划任务:
/etc/crontab #可以修改文件达成,给管理员用的
/etc/cron.d/ 配置文件 #和上面那个路径差不多
/etc/cron.hourly/ 脚本
#run-parts /etc/cron.hourly #去运行这个目录下所有脚本
/etc/cron.daily/ 脚本
/etc/cron.weekly/ 脚本
/etc/cron.monthly/ 脚本
 
anacron
运行计算机关机时cron 不运行的任务,CentOS6 以后版本
取消anacron 服务,由crond 服务管理
对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其
它不一直开机的系统很重要对很有用
配置文件:/etc/anacrontab ,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly 中系统任务。
? 字段1 :如果在这些日子里没有运行这些任务……
? 字段2 :在重新引导后等待这么多分钟后运行它
? 字段3 :任务识别器,在日志文件中标识
? 字段4 :要执行的任务
由/etc/cron.hourly/0anacron 执行
当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳
 
/usr/bin/on_ac_power #把电源拔了试试
 
whatis rm #查看数据库里这个命令的
 
#/etc/cron.daily
logrotate #用来发现日志文件是否过大,过大会分割创建个文件,保证文件不会太大
mandb #更新数据库 7上
mlocate
 
#ls /etc/cron.daily/ #脚本目录
#cat /etc/cron.daily/tmpwatch #这个文件会自动清除一些临时文件
CentOS6 使用/etc/cron.daily/tmpwatch 定时清除临时文件
CentOS7 使用systemd-tmpfiles-setup 服务实现
配置文件:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
命令:
systemd-tmpfiles –clean|remove|create configfile
 
#有特殊权限
用户cron:
crontab 命令定义,每个用户都有专用的cron 任务文件:/var/spool/cron/USERNAME
crontab 命令:
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任务 #默认只看自己的加-u才能看别人的
-e: 编辑任务;
#会创建个临时文件,不用写用户了
cd /var/spool/cron/ #文件放在这
-r: 移除当前用户所有任务
-i :同-r 一同使用,以交互式模式移除指定任务
-u user: 仅root 可运行,指定用户管理cron 任务
控制用户执行计划任务 :
/etc/cron.{allow,deny} #和at里的道理一样。 #默认也是没有allow,如果已经有了计划任务,还是会执行,因为改的是命令现在的权限了。
 
#用这个命令修改后,会删除旧文件,生成新文件。
export EDITOR=vim #使很多程序默认使用vim
vipw 相当于/etc/passwd #有语法检查功能
/var/log/cron #计划任务的日志。如果误删除在这找。
 
一次性作业使用 at
重复性作业使用crontab
Create at time crontab -e
List at -l crontab -l
Details at -c jobnum N/A
Remove at -d jobnum crontab -r
Edit N/A crontab -e
#没有被重定向的输出会被邮寄给用户
#根用户能够修改其它用户的作业
 
注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron 任务来讲,% 有特殊用途;如果在命令中要使用%,则需要转义,将%

入手内核的前篇之进程和计划任务