ntpdate 命令
[root@Centos6~]#ntpdate 172.18.0.1 -------->ntpdate 命令跟服務器同步時間
18 Dec 21:16:25 ntpdate[7932]: step time server 172.18.0.1 offset 412750.511124 sec
[root@Centos6~]#date
2017年 12月 18日 星期一 21:16:35 CST
[root@Centos6~]#ll /usr/bin/at
-rwsr-xr-x. 1 root root 54464 3月 22 2017 /usr/bin/at -------->具有SUID權限
cron 命令
- 週期性任務計劃:cron
相關的程序包:
- cronie: 主程序包,提供crond守護進程及相關輔助工具
Cronie包含在預定時間運行指定程序的標準UNIX守護進程crond和相關工具。 它是原來的vixie-cron的一個分支,並具有像使用pam和SELinux一樣的安全和配置增強功能
- cronie-anacron:cronie的補充程序,用於監控cronie任務執行狀況,如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨後啓動一次此任務
anacron是cronie的一部分,用於定期運行的工作,沒有確切的執行時間。anacron的默認設置執行每日,每週和每月的工作,但是anacron允許設置任意的工作週期。使用anacron可以運行週期性作業,即使系統經常關閉,也可以隨機執行作業執行時間,以更好地利用多個系統之間共享的資源
- crontabs:包含CentOS提供系統維護任務
fedora主要使用這個包來通過cron來執行文件。crontabs軟件包包含root crontab文件和目錄。將需要安裝cron守護進程以從crontabs運行作業。cron守護程序(如cronie或fcron)會檢查crontab文件以查看特定命令何時執行。 如果命令被安排,它執行它們。Crontabs處理一個基本的系統功能,所以它應該安裝在系統上
[root@Centos6~]#cat /etc/crontab ----------->查看系統計劃任務文件內容格式 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin ---------->PATH變量路徑,所以建議可執行程序建議寫全完整路徑 MAILTO=root HOME=/ # For details see man 4 crontabs # 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 11 10 * * * L wall hello [root@Centos6~]#cat /var/log/cron ----------->查看日誌文件 ........ Dec 19 10:11:01 Centos6 crond[2056]: (*system*) RELOAD (/etc/crontab) Dec 19 10:11:01 Centos6 CROND[8922]: (L) CMD (wall hello)
- 注意:命令執行的日期可以由兩個字段指定 - 日期和星期幾。如果兩個字段都受限制(即不是 * ),則當任一字段與當前時間匹配時,將運行該命令。
例如,“30 4 1,15 * 5”將會在每個月的1號和15號以及每個星期五的凌晨4點30分執行命令。
如果就想既是1,15號並且是星期5,就需要在計劃任務後加腳本,在腳本內判斷是否是星期5,如果是星期五在執行腳本,這樣就能達到既是1,15號並且是星期5的需求[root@Centos6~]#day=`date +%w`;[ "$day" = "2" ] && echo 2 ---------->判斷今天是否是星期2 2
- 計劃任務時間表示法
1) 特定值:給定時間點有效取值範圍內的值
2) */10 給定時間點上有效取值範圍內的所有值 表示“每...”
3) 離散取值 :1,3,4
4) 連續取值 :1-5
5) 在指定時間範圍上:定義步長 /#: #即爲步長
6) 用'@'字符修正:
@reboot: 重啓後運行一次。
@yearly: 每年運行一次,即。 0 0 1 1
@annually:每年運行一次,即。 0 0 1 1
@monthly: 每月運行一次,即。 0 0 1
@周: 每週運行一次,即。 0 0 0
@daily: 每天運行一次, 即。 0 0
@hourly: 每小時運行一次,即。 0
示例: 0 /3 * centos /bin/echo “howdy”;/usr/bin/wall “welcome!” --------->每3小時echo和wall命令[root@Centos6app]#vim /etc/crontab 0 1 * * * root /bin/tar Jcf /app/backup`date +\%F -d "-1 day"`.tar.xz /etc &>/dev/null ------->%需要轉義 [root@Centos6app]#ll -h -rw-r--r--. 1 root root 6.2M 12月 19 01:00 backup2017-12-18.tar.xz [root@Centos6app]#cat /var/log/cron Dec 19 01:00:01 Centos6 CROND[10418]: (root) CMD (/bin/tar Jcf /app/backup`date +%F -d "-1 day"`.tar.xz /etc &>/dev/null) **注意:對於cron任務來講,% 有特殊用途;如果在命令中要使用 %, 則需要轉義,將 % 放置於單引號中,則可不用轉義**
- 確保crond守護處於運行狀態:
CentOS 7:systemctl status crond
CentOS 6:service crond status[root@Centos7~]#service crond status -------這條舊命令其實引用的就是/bin/systemctl status crond.service 這條命令 Redirecting to /bin/systemctl status crond.service ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago Main PID: 955 (crond) CGroup: /system.slice/crond.service └─955 /usr/sbin/crond -n [root@Centos7~]#systemctl status crond.service atd ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago Main PID: 955 (crond) CGroup: /system.slice/crond.service └─955 /usr/sbin/crond -n 12月 17 16:21:13 Centos7.L systemd[1]: Started Command Scheduler. 12月 17 16:21:13 Centos7.L systemd[1]: Starting Command Scheduler... 12月 17 16:21:13 Centos7.L crond[955]: (CRON) INFO (RANDOM_DELAY will be scaled with f...d.) 12月 17 16:21:14 Centos7.L crond[955]: (CRON) INFO (running with inotify support) ● atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago Main PID: 958 (atd) CGroup: /system.slice/atd.service └─958 /usr/sbin/atd -f 12月 17 16:21:13 Centos7.L systemd[1]: Started Job spooling tools. 12月 17 16:21:13 Centos7.L systemd[1]: Starting Job spooling tools... Hint: Some lines were ellipsized, use -l to show in full.
系統的計劃任務
- 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 文件 的時間戳[root@Centos6anacron]#cat /etc/anacrontab --------> 查看anacrontab配置文件信息 #/etc/anacrontab: configuration file for anacron #See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root #the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 #the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly`
/etc/crontab ----------> 計劃任務的總配置文件,只有root用戶可以直接使用
[root@Centos6~]#ll /etc/crontab
-rw-r--r--. 1 root root 456 12月 19 01:02 /etc/crontab
/etc/cron.d/ 配置文件 ----------->計劃任務配置文件存放的位置,不建議全部都在/etc/crontab 文件中修改,以免因任務過多,導致錯亂
[[email protected]]#ll /etc/cron.d/
-rw-r--r--. 1 root root 113 8月 24 2016 0hourly
-rw-------. 1 root root 108 1月 26 2017 raid-check
-rw-------. 1 root root 235 3月 22 2017 sysstat
/etc/cron.hourly/ -----------> 每小時需要執行的計劃任務存放位置,0anacron腳本就是anacron服務的配置文件,
[root@Centos6~]#ll /etc/cron.hourly/ 因關機沒有執行的計劃任務,開機後每小時檢查一次,然後繼續執行相關計劃任務
-rwxr-xr-x. 1 root root 409 8月 24 2016 0anacron
[root@Centos6~]#cat /etc/cron.hourly/0anacron
#!/bin/bash
# Skip excecution unless the date has changed from the previous run
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0;
fi
# Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power &> /dev/null
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s
/etc/cron.daily/ ----------->系統每天要執行的計劃任務,這些計劃任務都是軟件安裝時自動形成的腳本,需要系統每天執行的任務就會放到這個文件夾內
[[email protected]]#ll /etc/cron.daily/
-rwx------. 1 root root 118 3月 22 2017 cups
-rwx------. 1 root root 180 7月 10 2003 logrotate
-rwx------. 1 root root 927 3月 22 2017 makewhatis.cron
-rwx------. 1 root root 189 1月 26 2015 mlocate.cron
-rwxr-xr-x. 1 root root 2126 7月 19 2013 prelink
-rwxr-xr-x. 1 root root 563 11月 23 2013 readahead.cron
-rwxr-xr-x. 1 root root 433 11月 7 2015 tmpwatch
/etc/cron.weekly/ -----------> 每星期需要執行的計劃任務存放位置
/etc/cron.monthly/ -----------> 每月期需要執行的計劃任務存放
[[email protected]]#ll /etc/cron
cron.d/ cron.deny cron.monthly/ cron.weekly/
cron.daily/ cron.hourly/ crontab
管理臨時文件
- 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
corntab 命令:用戶cron計劃任務
- crontab命令定義,每個用戶都有專用的cron任務文件
/var/spool/cron/USERNAME
- crontab命令:
用法:crontab [-u user] [-l | -r | -e] [-i]
常用選項
-l: 列出所有任務;
-e: 編輯任務;
-r: 移除所有任務; -i:同-r一同使用,以交互式模式移除指定任務
-u user: 僅root可運行,指定用戶管理cron任務 - 控制用戶執行計劃任務: /etc/cron.{allow,deny}
[root@Centos6~]#ls /var/spool/cron/L --------->普通用戶存放cron計劃任務配置文件的位置 /var/spool/cron/L [root@Centos6~]#crontab -l -u L --------->-l 選項只能查看自己的配置文件信息,如果需要查詢他人的,需要加-u 選項 * * * * * wall hello ---------> **配置內容不需要增加用戶信息這項** [root@Centos6cron]#ll /usr/bin/crontab ---------->**crontab 命令具有SUID權限** -rwsr-xr-x. 1 root root 51784 8月 24 2016 /usr/bin/crontab [root@Centos6anacron]#vim /etc/profile.d/env.sh --------> 默認crontab -e 配置內容使用的vi軟件,不具有vim功能,故可以修改默認的軟件設置。 export EDITOR=vim [root@Centos6~]#ll /var/spool/cron/ -d drwx------. 2 root root 4096 12月 19 14:55 /var/spool/cron/
at 命令
- at、batch 命令是從標準輸入或指定的文件中讀取,將在稍後執行的命令
- batc命令將在系統負載水平下降到特定水平時執行命令
- atq 命令列出用戶的待處理作業,除非用戶是超級用戶;在這種情況下,每個人的工作都被列出來了。
- atrm 命令刪除由工作號碼標識的工作
[root@Centos6~]#chkconfig --list atd --------> Centos6 上查看at命令是否開機自動啓動
atd 0:關閉 1:關閉 2:關閉 3:啓用 4:啓用 5:啓用 6:關閉
[root@Centos6~]#runlevel
5 3
[root@Centos6~]#chkconfig atd on -------->如果不是開機啓動,就用這條命令設置爲開機啓動
[root@Centos7~]#systemctl is-enabled atd.service --------->Centos7 上查看at命令是否開機啓動
enabled
[root@Centos7~]#systemctl enable atd
- 執行方式:
- 1)交互式 2)輸入重定向 3)at –f 文件
- 依賴與atd服務,需要啓動才能實現at任務
- at隊列存放在/var/spool/at目錄中
[root@Centos7~]#systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 4h ago
Main PID: 958 (atd)
CGroup: /system.slice/atd.service
└─958 /usr/sbin/atd -f ----------> 調用的就是/usr/sbin/atd 這個程序,958就是PID
[root@Centos7~]#ps aux | grep atd
root 958 0.0 0.0 25856 916 ? Ss 16:09 0:00 /usr/sbin/atd -f
[root@Centos6~]#at 21:25 ---------->交互式用法
at> wall ready to off work
at> <EOT>
job 1 at 2017-12-18 21:25
[root@Centos6~]#at -l
1 2017-12-18 21:25 a root
[root@Centos6~]#ls /var/spool/at/ -l
-rwx------. 1 root root 3232 12月 18 21:21 a000010180ede5 --------->執行後就會自動刪除文件
drwx------. 2 daemon daemon 4096 3月 22 2017 spool
[root@Centos6~]#at 21:27
at> hostname --------->計劃任務無法打印標準輸出內容,執行成功後的信息以郵件方式發給發起者
at> <EOT>
job 3 at 2017-12-18 21:27
[root@Centos6~]#hostname
Centos6.L
You have mail in /var/spool/mail/root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root Mon Dec 18 21:27 14/421 "Output from your job 3"
& 1
Message 1:
From [email protected] Mon Dec 18 21:27:01 2017
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Subject: Output from your job 3
To: [email protected]
Date: Mon, 18 Dec 2017 21:27:01 +0800 (CST)
From: [email protected] (root)
Status: R
Centos6.L ---------> at命令執行成功的信息,所以計劃任務以及腳本建議標準輸出直接到&>/dev/null
&
[root@Centos6~]#at 21:37 <<EOF --------->在腳本中可以使用這樣方法輸入配置
> wall Good night! --------->但建議把腳本的路徑添加上,因爲默認的PASH變量路徑可能有一定出入
> EOF
job 5 at 2017-12-18 21:37
[root@Centos6~]#at -c 5 --------->查看at計劃任務的信息
#!/bin/sh
# atrun uid=0 gid=0
..........
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH ------->變量地址
${SHELL:-/bin/sh} << 'marcinDELIMITER3692b1dd'
wall Good night!
marcinDELIMITER3692b1dd
[root@Centos6~]#echo -e "wall at job3\nwall at jobs4\nwall at jobs5"| at 21:45
job 6 at 2017-12-18 21:45
[root@Centos6~]#at -l
6 2017-12-18 21:45 a root
[root@Centos6~]#at -c 6
........
wall at job3
wall at jobs4
wall at jobs5
[root@Centos6~]#at 21:48 -m ----------->發送郵件確認
at> how are you
at> <EOT>
job 7 at 2017-12-18 21:48
[root@Centos6~]#at -l
7 2017-12-18 21:48 a root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 2 messages 1 new
>N 2 root Mon Dec 18 21:48 14/453 "Output from your job 7"
& 2
......
Subject: Output from your job 7 --------->來自第7個計劃任務
- at.allow (白名單)、at.deny(黑名單)
超級用戶可以在任何情況下使用這些命令。對於其他用戶,使用的權限由文件/etc/at.allow和/etc/at.deny確定
如果文件/etc/at.allow存在,則只允許在其中提及的用戶名在
如果/etc/at.allow不存在,則檢查/etc/at.deny,然後允許在其中未提及的每個用戶名使用at
如果不存在,則只允許超級用戶使用 at 命令,一個空的/etc/at.deny意味着每個用戶都可以使用這些命令,這是默認配置
[root@Centos6~]#cat /etc/at.deny ---------->默認黑名單爲空,所有用戶都可以用at命令制定計劃任務
[root@Centos6~]#cat /etc/at.allow ---------->默認沒有白名單這個文件,如果使用需要手工創建
cat: /etc/at.allow: 沒有那個文件或目錄
-
常用參數
-m 當任務被完成之後,將給用戶發送郵件,即使沒有標準輸出
-M 永遠不會發送郵件給用戶
-f 從指定的文件讀取作業而不是標準輸入
-l 是atq的別名
-r 是atrm的別名
-d 是atrm的別名
-v 顯示在閱讀作業之前作業將被執行的時間。顯示的時間將採用格式“Thu Feb 20 14:50:00 1997”
-c 將命令行上列出的作業捕獲到標準輸出(查看具體的作業任務) - 示例
- at命令接受HH:MM形式的時間在一天的特定時間託管一個工作。(如果時間已經過去,則假定是第二天)。
- 也可以指定午夜,中午或下午茶時間(下午4點),並且可以在上午或下午晚間。
- 也可以通過在選擇年份的月份名稱日期中給出日期,或者給出MMDDYY或MM / DD / YY或DD.MM.YY或YYYY的日期來說明工作將在哪一天運行-MM-DD。
- 日期的規格必須遵循當天的規格。也可以給出像現在這樣的時間+計算時間單位,其中時間單位可以是幾分鐘,幾小時,幾天或幾周,
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 tomorrowHH:MM[am|pm] + number [minutes|hours|days|weeks]
在某個時間點再加幾個時間後才進行該項任務
now + 5 minutes
02pm + 3 days
at和crontab 對比
- 一次性作業使用 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任務來講,%有特殊用途;如果在命令中要使用%, 則需要轉義,將%放置於單引號中,則可不用轉義
* 1) 如何在秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
* 2) 如何實現每7分鐘運行一次任務?
* sleep命令:
sleep NUMBER[SUFFIX]...
SUFFIX:
s: 秒, 默認 m: 分
h: 小時
d: 天
並行運行
- 同時運行多個進程,提高效率
方法1
vi all.sh f1.sh& f2.sh& f3.sh&
方法2
(f1.sh&);(f2.sh&);(f3.sh&)
方法3
{ f1.sh& f2.sh& f3.sh& }
1、每天的2點和12點整,將/etc備份至/testdir/backup目 錄中,保存的文件名稱格式爲“etcbak-yyyy-mm-dd-HH.tar.xz”
0 2,12 * * * root /bin/tar Jcf /testdir/backup/etcbak`date +\%Y-\%m-\%d-\%H`.tar.xz /etc &>/dev/null
2、每週2, 4, 7備份/var/log/messages文件至/logs目錄中 ,文件名形如“messages-yyyymmdd”
0 0 * * 2,4,7 root /bin/tar Jcf /logs/messages-`date +\%F` /var/log/messages &>/dev/null
3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * root cat /proc/meminfo | egrep "^S|^M" >> /tmp/meminfo.txt
4、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現 任何分區利用率高於80%,就執行wall警報
*/10 0 * * 1-5 root /app/disk.sh -------->因命令內容過多,建議寫到一個簡單腳本中,腳本內容如下
/app/disk.sh
disk=`df | grep "/dev/sd" | sort -r | head -n1`
[ "$disk" > 80% ] && wall "disk will be full"