Crontab周期性任务

at可以一次性执行。service atd status,它可以使用黑名单和白名单控制,参见/etc/at.deny,at.allow

1
2
3
4
5
$ at now+5 minutes
at> echo hehe # ctrl + d保存退出
$ atq # 查看at任务
$ at -c 1 # 查看工作号执行的具体任务
$ atrm 1 # 删除at任务

同理crontab也有访问控制文件cron.deny等。
系统服务crond每分钟会从配置文件中刷新定时任务。

1
2
$ crontab -l # 列出任务,-r 清空
$ service crond status # 查看服务是否正常启动

crontab的格式

crontab -e可以编辑计划任务。在最后追加

1
2
3
4
5
6
7
8
9
10
11
12
# 每分钟输出系统时间到文件
*/1 * * * * date >> /tmp/date.tmp
# 每天21:30重启apache
30 21 * * * service httpd restart
# 每月1号、10号、22号4:45重启apache
45 4 1,10,22 * * service httpd restart
# 每月1~10号的4:45重启apache
45 4 1-10 * * service httpd restart
# 每隔2分钟
*/2 * * * * service httpd restart
# 晚上11点到早上7点,每隔1小时
0 23-7/1 * * * service httpd restart

以root身份执行下列命令

1
2
3
4
5
$ crontab -e
1-59/2 * * * * echo "奇数分钟"
$ crontab -e -u user1
0-58/2 * * * * echo "偶数分钟"
$ tail -f /var/log/cron

查看crond的日志文件可以发现每次都是新启动了一个进程。

配置文件

/etc/crontab,/etc/crond/filename,这两个是系统级的定时任务,使用crontab -l 命令无法列出。

/etc/crontab中实际上是指定了MAILTO=root,即将定时任务执行的结果发送给root,我们可以查看/var/spool/mail/root文件。

1
2
*/1 * * * * root echo "job in the /etc/crontab"
*/1 * * * * user1 echo "job in the /etc/cron.d/user1"

crontab -l命令列出的任务实际上位于/var/spool/cron/username文件。

crontab最小单位是1分钟,如何让每0.5分钟执行一次?其实可以配置sleep命令。

1
2
*/1 * * * * date >> /tmp/tmp.date
*/1 * * * * sleep 30s;date >> /tmp/tmp.date

/usr其实不是user的缩写,而是Unix System Resource的缩写。

系统定时任务我们也可以将脚本拷贝到/etc/cron.daily|hourly|monthly|weekly中将被anacron自动管理,推荐使用这种方式。

anacron配置

如果执行定时任务之前宕机了,anacron会自动判断是否需要重新执行定时任务。其配置文件位于/etc/anacrontab

Linux服务管理

系统运行级别可以使用runlevel查看,可以使用init level进入特定的运行级别。

/etc/services文件写了常规服务和端口的映射。

1
2
$ chkconfig --list | grep nginx
$ chkconfig --level 2345 nginx on # 设置nginx开机自启动(2,3,4,5指定运行级别)

第二种方式设置开机自启动可以编辑配置文件/etc/rc.d/rc.local(别忘了赋予可执行权限),该文件和/etc/rc.local是一个软链接,修改哪个都一样。

centos中的服务

进程管理

有计划重启服务器是系统维护的重要原则。

ps aux中TIME指的是进程占用CPU的时间,使用pstree -pu可以显示进程树(包含用户名和pid)。
top命令支持交互模式(P,CPU排序,M,内存排序,N,pid排序),该命令的前5行解释如下:

1
2
3
4
5
top - 20:19:51 up 19 days, 16:38,  2 users,  load average: 0.15, 0.19, 0.18 # 1min,5min,15min的平均负载,单核不能大于1,双核不能大于2
Tasks: 241 total, 1 running, 240 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.7%us(用户空间占用), 0.2%sy(内核空间占用), 0.0%ni(改变过优先级的进程占用), 98.9%id(空闲,不能低于20%), 0.1%wa(IO等待进程), 0.0%hi(硬中断请求), 0.0%si(软中断请求), 0.0%st(虚拟时间steal time,当有虚拟机时,虚拟CPU等待实际CPU的百分比)
Mem: 12148312k total, 12006948k used, 141364k free, 401640k buffers
Swap: 2096444k total, 13472k used, 2082972k free, 7821136k cached

w命令可以查看登陆到当前系统中的用户,使用pkill可以按照登陆的终端号踢出用户,例如:pkill -9 -t tty1

工作管理

就是将程序放到后台执行。将程序放入后台有2种方法:

  1. 在执行的命令后面加上&(后台运行);
  2. 执行命令后按下Ctrl+Z(后台暂停)。

放入后台后可以使用jobs -l命令查看后台工作(+表示最后一个放入到后台的工作,-表示倒数第二个)。需要注意的是放入后台的任务不能和用户交互。
fg %工作号将后台挂起的进程恢复到前台执行;bg %工作号用于将后台暂停的工作(Ctrl+Z)恢复到后台执行。

touch命令并不是新建文件,而是修改文件的时间戳

把命令放入后台执行只能在当前终端执行,一旦退出或者关闭终端后台程序就会终止(发送了SIGHUB信号)!标准方法是使用nohub 命令 &

time命令用于统计程序的运行时间,包括用户态和内核态。详见:开源中国

Linux上源码安装的3个步骤是./configure && make && make install,在configuration的时候可以使用-h查看编译选项。