1、讓進程并行后臺運行的三種方式
方法一:寫到腳本里
[root@redhat7 ~]#vim all.sh
#!/bin/bash
ping 172.18.0.1&
ping 127.1.1.1&
[root@redhat7 ~]#chmod a+x all.sh
[root@redhat7 ~]#./all.sh ---運行這個腳本發現兩個進程在后臺并行運行
[root@redhat7 ~]#PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
PING 127.1.1.1 (127.1.1.1) 56(84) bytes of data.
64 bytes from 127.1.1.1: icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=1.50 ms
64 bytes from 127.1.1.1: icmp_seq=2 ttl=64 time=0.023 ms
方法二:使用小括號
[root@redhat7 ~]#(ping 172.18.0.1&);(ping 127.1.1.1&) ---使用小括號,中間加分號
[root@redhat7 ~]#PING 127.1.1.1 (127.1.1.1) 56(84) bytes of data.
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 127.1.1.1: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.499 ms
64 bytes from 127.1.1.1: icmp_seq=2 ttl=64 time=0.022 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.530 ms
方法三:使用大括號
[root@redhat7 ~]#{ ping 172.18.0.1& ping 127.1.1.1& } ---注意大括號前后要有空格
[1] 5921
[2] 5922
[root@redhat7 ~]#PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
PING 127.1.1.1 (127.1.1.1) 56(84) bytes of data.
64 bytes from 127.1.1.1: icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=2.53 ms
64 bytes from 127.1.1.1: icmp_seq=2 ttl=64 time=0.022 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.450 ms
2、用at命令實現一次性的計劃任務
- at基本用法
rpm -ql at---首先查看一下at包的服務名為atd,這樣就可以查看at服務是否已經打開
[root@centos6 ~]#service atd status
atd (pid 1681) is running...
[root@redhat7 at]#systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-08-23 08:13:29 CST; 12h ago ---顯示正在運行
Main PID: 683 (atd)
CGroup: /system.slice/atd.service
└─683 /usr/sbin/atd -f
Aug 23 08:13:29 redhat7.4.magedu.com systemd[1]: Started Job spooling tools.
Aug 23 08:13:29 redhat7.4.magedu.com systemd[1]: Starting Job spooling tools...
Hint: Some lines were ellipsized, use -l to show in full.
要想使用at命令進行一次性的計劃任務,首先要確定這個程序是否已經打開。
[root@redhat7 at]#at 21:30 ---創建計劃任務,at是一個交互式的命令,
讀取鍵盤輸入,輸入完計劃任務后按ctrl+d或ctrl+\正常退出,而不能用ctrl+c退出
at> wall class is over<EOT>
job 1 at Wed Aug 23 21:30:00 2017
[root@redhat7 at]#at -l ---顯示計劃任務和作業編號
1 Wed Aug 23 21:30:00 2017 a root
[root@redhat7 at]#ls /var/spool/at
---發現計劃任務存放在這個目錄下的a00001017e5bca的文件中,所以重啟電腦計劃任務也不會丟失
a00001017e5bca spool
[root@redhat7 at]#at -c 1 ---1是用-l顯示的計劃任務的編號
上面命令可以查看計劃任務的內容,跟cat /var/spool/at/a00001017e5bca的內容是一樣的
[root@redhat7 at]#at -d 1 ---刪除計劃任務
[root@redhat7 at]#at -V ---查看at包的版本信息
at version 3.1.13
[root@redhat7 at]#at 21:05 ---創建一個計劃任務是在屏幕上打印一個xixi
at> echo "xixi"<EOT>
job 2 at Wed Aug 23 21:05:00 2017
[root@redhat7 at]#ls ---已經將計劃任務保存到文件中
a00002017e5bb1 spool
[root@redhat7 at]#date ---已經過了時間也沒有發現在屏幕上打印
Wed Aug 23 21:05:06 CST 2017
[root@redhat7 at]#at -l ---看計劃任務已經沒有了,說明計劃任務已經執行了
[root@redhat7 at]#mail ---打開郵件,會收到一封郵件
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root Wed Aug 23 21:05 14/491 "Output from your job 2"
& 1
Message 1:
From root@redhat7.4.magedu.com Wed Aug 23 21:05:00 2017
Return-Path: <root@redhat7.4.magedu.com>
X-Original-To: root
Delivered-To: root@redhat7.4.magedu.com
Subject: Output from your job 2
To: root@redhat7.4.magedu.com
Date: Wed, 23 Aug 2017 21:05:00 +0800 (CST)
From: root@redhat7.4.magedu.com (root)
Status: R
xixi ---這是打印的內容在郵件里出現了,說明有標準輸出時計劃任務不會在屏幕上打印,
而是已郵件的方式發送,因為計劃任務執行時你不一定在電腦跟前,
打印出來也沒用,所以會發郵件
& quit
Held 1 message in /var/spool/mail/root
[root@redhat7 ~]#vim f1 ---創建一個文件,寫上要執行的命令
wall class is over
rm -f /root/all.sh
[root@redhat7 ~]#at -f f1 21:24 ---從指定文件中讀取任務
job 4 at Wed Aug 23 21:24:00 2017
[root@redhat7 ~]#at -l ---任務創建成功
4 Wed Aug 23 21:24:00 2017 a root
[root@redhat7 ~]# ---任務執行成功
Broadcast message from root@redhat7.4.magedu.com (Wed Aug 23 21:24:00 2017):
class is over
[root@redhat7 ~]#ls ---all.sh文件已刪除
anaconda-ks.cfg f1
[root@redhat7 ~]#ll `which at`
-rwsr-xr-x. 1 root root 52944 May 23 2016 /usr/bin/at ---具有suid權限,普通用戶也可以執行at命令
總結:at創建計劃任務時最好不要帶標準輸出,否則也不會在屏幕上打印,只會給你發郵件,郵件多了會占用空間,發廣播wall會在屏幕上打印,at創建的計劃任務時一次性,執行完畢計劃任務就會自動消失,/var/spool/at 目錄下的文件也會自動刪除。如果你就想知道這個任務是否執行了,但卻沒有標準輸出,不會發郵件通知,可以用at-m實現即使沒有標準輸出也會給用戶發郵件,默認是給root用戶發。
at命令來源的文件具有suid權限,所以普通用戶也可以執行at命令,創建計劃任務。
TIME:定義出什么時候進行at 這項任務的時間,時間格式分為以下幾種:
HH:MM [YYYY-mm-dd]---表示小時:分 年-月-日
[root@redhat7 ~]#at 24:00 2017-08-24
at> wall class is over<EOT>
job 11 at Fri Aug 25 00:00:00 2017
noon, midnight, teatime(4pm),tomorrow
now+#{minutes,hours,days, OR weeks} ---at now+5minutes 表示5分鐘之后
at -t [[CC]YY]MMDDhhmm[.ss] ---表示世紀年月日小時分.秒
[root@redhat7 ~]#at -t 201708232143.30
at> wall class is over<EOT>
job 5 at Wed Aug 23 21:43:00 2017
[root@redhat7 ~]#
Broadcast message from root@redhat7.4.magedu.com (Wed Aug 23 21:43:00 2017):
class is over
- at的管道和重定向
我們知道at命令可以讀取鍵盤輸入,那么就可以用標準輸入的重定向和管道來實現計劃任務
[root@redhat7 ~]#echo "wall class is over"|at 21:49
---使用管道
job 7 at Wed Aug 23 21:49:00 2017
[root@redhat7 ~]#at -l
7 Wed Aug 23 21:49:00 2017 a root
[root@redhat7 ~]#echo "touch f2"|at 21:51
---一定要注意我們是把一個命令傳給at,所以要用echo,不用echo
是把命令的執行結果的標準輸出傳給at,touch f2這個命令沒有標準輸出
job 8 at Wed Aug 23 21:51:00 2017
[root@redhat7 ~]#at -l
8 Wed Aug 23 21:51:00 2017 = root
[root@redhat7 ~]#at 21:55 <<end ---也可以用多行重定向
> wall class is over
> rm -f /root/f1
> end
job 9 at Wed Aug 23 21:55:00 2017
[root@redhat7 ~]#at -l
9 Wed Aug 23 21:55:00 2017 a root
[root@redhat7 ~]#vim f1
wall class is over
rm -f /root/f2
[root@redhat7 ~]#at 21:58 <f1 ---可以用標準輸入的重定向
job 10 at Wed Aug 23 21:58:00 2017
[root@redhat7 ~]#at -l
10 Wed Aug 23 21:58:00 2017 a root
[root@redhat7 ~]#
Broadcast message from root@redhat7.4.magedu.com (Wed Aug 23 21:58:01 2017):
class is over
[root@redhat7 ~]#
[root@redhat7 ~]#ls
anaconda-ks.cfg f1 f3
- at計劃任務的黑名單和白名單
/etc/at.{allow,deny}控制用戶是否能執行at任務
白名單:/etc/at.allow默認不存在,只有該文件中的用戶才能執行at命令
黑名單:/etc/at.deny默認存在,拒絕該文件中用戶執行at命令,而沒有在at.deny文件中的使用者則可執行
如果兩個文件同時存在,則白名單的優先級高,只有在白名單中的用戶才能執行at命令,就相當于黑名單不存在。
如果兩個文件都不存在,只有root 可以執行at 命令。
執行時只要在兩個文件中把用戶名加上就可以了。
3、周期性的計劃任務cron
相關的程序包:
cronie: 主程序包,提供crond守護進程及相關輔助工具
cronie-anacron:cronie的補充程序,用于監控cronie任務執行狀況,如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務
crontabs:包含CentOS提供系統維護任務
查看一下這個三個包都生成哪些文件
[root@redhat7 ~]#rpm -ql cronie
/etc/cron.d ---root用戶可以在這個目錄下創建一個文件,格式
和/etc/crontab一樣,就可以定義周期性的計劃任務,每個以root身份
登錄的用戶可以在這個目錄下創建自己的周期性計劃任務
/etc/cron.d/0hourly
/etc/cron.deny ---黑名單,在這個名單中的用戶將不能執行周期性的計劃任務
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service ---服務名
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron
[root@redhat7 ~]#rpm -ql crontabs
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly ---可以將自己寫的腳本存放在以上四個目錄下,就
可以周期性的執行了
/etc/crontab ---root用戶可以修改這個配置文件來設置周期性的計劃任務,只用root用戶可以修改
/etc/sysconfig/run-parts
/usr/bin/run-parts
/usr/share/man/man4/crontabs.4.gz
/usr/share/man/man4/run-parts.4.gz
[root@redhat7 ~]#rpm -ql cronie-anacron
/etc/anacrontab
/etc/cron.hourly/0anacron
/usr/sbin/anacron
/usr/share/man/man5/anacrontab.5.gz
/usr/share/man/man8/anacron.8.gz
/var/spool/anacron
/var/spool/anacron/cron.daily
/var/spool/anacron/cron.monthly
/var/spool/anacron/cron.weekly
執行任務之前進行的操作
?確保crond守護處于運行狀態:
CentOS 7:
systemctlstatus crond
CentOS 6:
service crondstatus
?計劃周期性執行的任務提交給crond,到指定時間會自動運行
系統cron任務:系統維護作業
/etc/crontab
用戶cron任務:
crontab命令
?日志:/var/log/cron
- 系統cron任務
[root@redhat7 log]#vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
*/10 * * * 1-5 root /app/diskused.sh 表示周一至周五每十分鐘root用
戶執行/app/diskused.sh這個腳本
30 4 1,15 * 5 root rm-rf /app/* ---表示每個月的1和15號的4:30或者每
個月星期五的4:30,root用戶執行的命令,這里1和15號不一定是星
期五,兩個時間發生沖突,就會表示或者的關系,其他的時候都是表
示并且的關系,只有這兩個時間發生沖突的時候才表示或者的關系
* * * * 1-5 zhang rm-rf /app/* ---如果換成zhang用戶去執行,因為他執行不了,就會給root用戶發郵件。
?時間表示法:
如果第一位為以下表示方式
* ---表示每
*/10 --表示每十分鐘執行什么操作
30/5---表示從每個小時的三十分開始每5分鐘執行什么操作
時間格式
?@reboot Run once after reboot. ---表示每次重啟執行什么操作
?@yearly 0 0 1 1 * ---每年的一月一日零點零分
?@annually 0 0 1 1 * ---每年的一月一日零點零分
?@monthly 0 0 1 * * ---每月的1號零點零分
?@weekly 0 0 * * 0 ---表示每周日的零點零分
?@daily 0 0 * * * ----每天得零點零分
?@hourly 0 * * * * ---每小時的0分鐘
?示例:每3小時echo和wall命令
0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall “welcome to Magedu!”
root用戶在/etc/cron.d/目錄下創建一個和/etc/crontab格式相同的文件,也可以實現周期性的計劃任務,此種方法可以讓多個以root 身份登錄的用戶每個人都擁有自己的計劃任務,而不用每個人都在/etc/crontab文件中更改,造成混亂,不知道是誰的計劃任務。
實例
[root@redhat7 ~]#cp /etc/crontab /etc/cron.d/zhangtab
[root@redhat7 ~]#cd /etc/cron.d
[root@redhat7 cron.d]#ls ---發現創建成功
0hourly zhangtab
[root@redhat7 cron.d]#vim zhangtab ---格式和 /etc/crontab文件完全相同
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
* * * * * root /app/diskused.sh
~
將自己寫好的腳本存放在一下四個目錄下可以自動執行周期性的任務
/etc/cron.hourly/ 腳本
/etc/cron.daily/腳本
/etc/cron.weekly/腳本
/etc/cron.monthly/腳本
- 用戶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@redhat7 app]#crontab -e
* * * * * touch /app/`date +\%F`.log ---帶%的要加轉義符號,否則執
行不了,或者放到腳本中執行
[root@redhat7 app]#crontab -l ---列出所有任務
* * * * * touch /app/`date +\%F`.log
[root@redhat7 app]#cd /var/spool/cron/ ---每個用戶都有自己的cron任務文件
[root@redhat7 cron]#ls
root
[root@redhat7 cron]#cat root ---看這個文件相當于crontab -l
* * * * * touch /app/`date +\%F`.log
[root@redhat7 app]#ls ----執行成功
2017-08-23.log diskused.sh menu.sh scp.sh yesno.sh
[root@redhat7 app]#crontab -r ---刪除
[root@redhat7 app]#crontab -l ---此時再查看已經沒有了
no crontab for root
[root@redhat7 ~]#su - zhang ---切換到zhang用戶
Last login: Wed Aug 23 08:46:44 CST 2017 on pts/1
[zhang@redhat7 ~]$crontab -e ---編輯
no crontab for zhang - using an empty one
* * * * * wall good morning!
[zhang@redhat7 ~]$crontab -l
* * * * * wall good morning!
[zhang@redhat7 ~]$exit
logout
[root@redhat7 ~]#crontab -l -u zhang ---管理員可以看其他用戶的計劃任務
* * * * * wall good morning!
[root@redhat7 ~]#crontab -r -u zhang ---刪除zhang用戶的計劃任務
[root@redhat7 ~]#crontab -l -u zhang ---列出zhang的計劃任務,發現已經刪除了
no crontab for zhang
[root@redhat7 ~]#su - zhang ---切換到zhang用戶
Last login: Thu Aug 24 08:54:44 CST 2017 on pts/0
[zhang@redhat7 ~]$crontab -e ---編輯
no crontab for zhang - using an empty one
0 1 * * * wall good morning
[zhang@redhat7 ~]$crontab -l
0 1 * * * wall good morning
[zhang@redhat7 ~]$exit ---退出
logout
[root@redhat7 ~]#crontab -e -u zhang ---root用戶編輯zhang修改zhang的計劃任務
0 1 1 * * wall good morning
[root@redhat7 ~]#ll /var/spool/cron/zhang ---修改之后發現文件的所有者和所屬組編程root
-rw-------. 1 root root 28 Aug 24 09:04 /var/spool/cron/zhang
[root@redhat7 ~]#su - zhang ---切換到zhang用戶
Last login: Thu Aug 24 09:01:45 CST 2017 on pts/0
[zhang@redhat7 ~]$crontab -e ---發現仍然可以編輯,說明crontab這個命令對應的文件具有suid權限
0 1 1 * * wall good morning
[root@redhat7 ~]#ll /var/spool/cron/zhang ---zhang編輯完之后所有者和所屬組又變回zhang
-rw-------. 1 zhang zhang 28 Aug 24 09:08 /var/spool/cron/zhang
[root@redhat7 ~]#echo 'export EDITOR=vim'>/etc/profile.d/cron.sh
默認情況下crontab -e打開的時候使用vi編輯器,要想使用vim編輯
器,可以用此種方法定義個變量,重定向到/etc/profile.d/下的一個文件中即可
簡單的例子:
0 */2 * * * /sbin/service httpd restart
每兩個小時重啟一次apache
50 7 * * * /sbin/service sshd start
每天7:50開啟ssh服務
50 22 * * * /sbin/service sshd stop
每天22:50關閉ssh服務
0 0 1,15 * * fsck /home
每月1號和15號檢查/home 磁盤
1 * * * * /home/bruce/backup
每分鐘都執行 /home/bruce/backup這個文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;
每周一至周五凌晨3點,在目錄/home中,查找文件名為*.xxx的文件,并刪除4天前的文件。
30 6 */10 * * ls
每月的1、11、21、31日是的6:30執行一次ls命令
總結:root可以修改其他用戶的計劃任務, 修改之后文件的權限變為root,但其他用戶仍然可以通過crontab命令編輯,說明crontab對應的文件具有suid權限,和at命令一樣。
4、at和cron區別
注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶,對于cron任務來講,%有特殊用途;如果在命令中要使用%,則需要轉義,將%放置于單引號中或者寫在腳本中,則可不用轉義。
5、sleep命令
sleep NUMBER[SUFFIX]...
SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天