15.2.2 實際運作單一工作排程

單一工作排程的進行就使用 at 這個指令囉!這個指令的運作非常簡單!將 at 加上一個時間即可!基本的語法如下:

[root@study ~]# at [-mldv] TIME

[root@study ~]# at -c 工作號碼

選項與參數:

-m :當 at 的工作完成後,即使沒有輸出訊息,亦以 email 通知使用者該工作已完成。

-l :at -l 相當於 atq,列出目前系統上面的所有該使用者的 at 排程;

-d :at -d 相當於 atrm ,可以取消一個在 at 排程中的工作;

-v :可以使用較明顯的時間格式列出 at 排程中的工作列表;

-c :可以列出後面接的該項工作的實際指令內容。

TIME:時間格式,這裡可以定義出『什麼時候要進行 at 這項工作』的時間,格式有:

HH:MMex> 04:00

在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此工作。

HH:MM YYYY-MM-DDex> 04:00 2015-07-30

強制規定在某年某月的某一天的特殊時刻進行該工作!

HH:MM[am|pm] [Month] [Date]ex> 04pm July 30

也是一樣,強制在某年某月某日的某時刻進行!

HH:MM[am|pm] + number [minutes|hours|days|weeks]

ex> now + 5 minutesex> 04pm + 3 days

就是說,在某個時間點『再加幾個時間後』才進行。

老實說,這個 at 指令的下達最重要的地方在於『時間』的指定了!鳥哥喜歡使用『 now + ... 』

的方式來定義現在過多少時間再進行工作,但有時也需要定義特定的時間點來進行!底下的範例先看看囉!

範例一:再過五分鐘後,將 /root/.bashrc 寄給 root 自己

[root@study ~]# at now + 5 minutes <==記得單位要加 s 喔!

at> /bin/mail -s "testing at job" root < /root/.bashrc

at> <==這裡輸入 [ctrl] + d 就會出現 的字樣!代表結束!

job 2 at Thu Jul 30 19:35:00 2015

# 上面這行資訊在說明,第 2 個 at 工作將在 2015/07/30 的 19:35 進行!

# 而執行 at 會進入所謂的 at shell 環境,讓你下達多重指令等待運作!

範例二:將上述的第 2 項工作內容列出來查閱

[root@study ~]# at -c 2

#!/bin/sh <==就是透過 bash shell 的啦!

# atrun uid=0 gid=0

# mail root 0

umask 22

....(中間省略許多的環境變數項目)....

cd /etc/cron\.d || {

echo 'Execution directory inaccessible' >&2

exit 1

}

${SHELL:-/bin/sh} << 'marcinDELIMITER410efc26'

/bin/mail -s "testing at job" root < /root/.bashrc # 這一行最重要!

marcinDELIMITER410efc26

# 你可以看到指令執行的目錄 (/root),還有多個環境變數與實際的指令內容啦!

範例三:由於機房預計於 2015/08/05 停電,我想要在 2015/08/04 23:00 關機?

[root@study ~]# at 23:00 2015-08-04

at> /bin/sync

at> /bin/sync

at> /sbin/shutdown -h now

at>

job 3 at Tue Aug 4 23:00:00 2015

# 您瞧瞧! at 還可以在一個工作內輸入多個指令呢!不錯吧!

事實上,當我們使用 at 時會進入一個 at shell 的環境來讓使用者下達工作指令,此時,建議你最好使用絕對路徑來下達你的指令,比較不會有問題喔!由於指令的下達與 PATH 變數有關,

同時與當時的工作目錄也有關連 (如果有牽涉到檔案的話),因此使用絕對路徑來下達指令,會是比較一勞永逸的方法。

為什麼呢?舉例來說,你在 /tmp 下達『 at now 』然後輸入『 mail -s "test" root < .bashrc 』,

問一下,那個 .bashrc 的檔案會是在哪裡?答案是『 /tmp/.bashrc 』!因為at 在運作時,會跑到當時下達 at 指令的那個工作目錄的緣故啊!

有些朋友會希望『我要在某某時刻,在我的終端機顯示出 Hello 的字樣』,然後就在 at 裡面下達這樣的資訊『

echo "Hello" 』。等到時間到了,卻發現沒有任何訊息在螢幕上顯示,這是啥原因啊?這是因為 at 的執行與終端機環境無關,而所有 standard output/standard error output

都會傳送到執行者的 mailbox 去啦!所以在終端機當然看不到任何資訊。那怎辦?沒關係,

可以透過終端機的裝置來處理!假如你在 tty1 登入,則可以使用『 echo "Hello" > /dev/tty1 』來取代。

Tips

要注意的是,如果在 at shell 內的指令並沒有任何的訊息輸出,那麼 at 預設不會發 email 給執行者的。

如果你想要讓 at 無論如何都發一封 email 告知你是否執行了指令,那麼可以使用『 at -m 時間格式 』來下達指令喔!

at 就會傳送一個訊息給執行者,而不論該指令執行有無訊息輸出了!

at 有另外一個很棒的優點,那就是『背景執行』的功能了!什麼是背景執行啊?很難瞭解嗎?其實與 bash 的 nohup

(第十六章) 類似啦!

鳥哥提我自己的幾個例子來給您聽聽,您就瞭了!

離線繼續工作的任務:鳥哥初次接觸 Unix 為的是要跑空氣品質模式,

那是一種大型的程式,這個程式在當時的硬體底下跑,一個案例要跑 3 天!由於鳥哥也要進行其他研究工作,因此常常使用 Windows

98 (你沒看錯!鳥哥是老人...) 來連線到 Unix 工作站跑那個 3 天的案例!結果你也該知道, Windows 98 連開三天而不當機的機率是很低的~@_@~

而當機時,所有在 Windows 上的連線都會中斷!包括鳥哥在跑的那個程式也中斷了~嗚嗚~明明再三個鐘頭就跑完的程式,

由於當機害我又得跑 3 天!

另一個常用的時刻則是例如上面的範例三,由於某個突發狀況導致你必須要進行某項工作時,這個 at 就很好用啦!

由於 at 工作排程的使用上,系統會將該項 at 工作獨立出你的 bash 環境中,

直接交給系統的 atd 程式來接管,因此,當你下達了 at 的工作之後就可以立刻離線了,

剩下的工作就完全交給 Linux 管理即可!所以囉,如果有長時間的網路工作時,嘿嘿!

使用 at 可以讓你免除網路斷線後的困擾喔! ^_^

at 工作的管理

那麼萬一我下達了 at 之後,才發現指令輸入錯誤,該如何是好?就將他移除啊!利用 atq 與 atrm 吧!

[root@study ~]# atq

[root@study ~]# atrm (jobnumber)

範例一:查詢目前主機上面有多少的 at 工作排程?

[root@study ~]# atq

3 Tue Aug 4 23:00:00 2015 a root

# 上面說的是:『在 2015/08/04 的 23:00 有一項工作,該項工作指令下達者為

# root』而且,該項工作的工作號碼 (jobnumber) 為 3 號喔!

範例二:將上述的第 3 個工作移除!

[root@study ~]# atrm 3

[root@study ~]# atq

# 沒有任何資訊,表示該工作被移除了!

如此一來,你可以利用 atq 來查詢,利用 atrm 來刪除錯誤的指令,利用 at 來直接下達單一工作排程!很簡單吧!

不過,有個問題需要處理一下。如果你是在一個非常忙碌的系統下運作 at ,

能不能指定你的工作在系統較閒的時候才進行呢?可以的,那就使用 batch 指令吧!

batch:系統有空時才進行背景任務

其實 batch 是利用 at 來進行指令的下達啦!只是加入一些控制參數而已。這個 batch 神奇的地方在於:他會在 CPU 的工作負載小於 0.8 的時候,才進行你所下達的工作任務啦!

那什麼是工作負載 0.8 呢?這個工作負載的意思是: CPU 在單一時間點所負責的工作數量。不是 CPU 的使用率喔!

舉例來說,如果我有一隻程式他需要一直使用 CPU 的運算功能,那麼此時 CPU 的使用率可能到達 100% ,

但是 CPU 的工作負載則是趨近於『 1 』,因為 CPU 僅負責一個工作嘛!如果同時執行這樣的程式兩支呢?

CPU 的使用率還是 100% ,但是工作負載則變成 2 了!瞭解乎?

所以也就是說,當 CPU 的工作負載越大,代表 CPU 必須要在不同的工作之間進行頻繁的工作切換。

這樣的 CPU 運作情況我們在第零章有談過,忘記的話請回去瞧瞧!因為一直切換工作,所以會導致系統忙碌啊!

系統如果很忙碌,還要額外進行 at ,不太合理!所以才有 batch 指令的產生!

在 CentOS 7 底下的 batch 已經不再支援時間參數了,因此 batch 可以拿來作為判斷是否要立刻執行背景程式的依據!

我們底下來實驗一下 batch 好了!為了產生 CPU 較高的工作負載,因此我們用了 12 章裡面計算 pi 的腳本,連續執行 4 次這隻程式,

來模擬高負載,然後來玩一玩 batch 的工作現象:

範例一:請執行 pi 的計算,然後在系統閒置時,執行 updatdb 的任務

[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &

[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &

[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &

[root@study ~]# echo "scale=100000; 4*a(1)" | bc -lq &

# 然後等待個大約數十秒的時間,之後再來確認一下工作負載的情況!

[root@study ~]# uptime

19:56:45 up 2 days, 19:54, 2 users, load average: 3.93, 2.23, 0.96

[root@study ~]# batch

at> /usr/bin/updatedb

at>

job 4 at Thu Jul 30 19:57:00 2015

[root@study ~]# date;atq

Thu Jul 30 19:57:47 CST 2015

4 Thu Jul 30 19:57:00 2015 b root

# 可以看得到,明明時間已經超過了,卻沒有實際執行 at 的任務!

[root@study ~]# jobs

[1] Running echo "scale=100000; 4*a(1)" | bc -lq &

[2] Running echo "scale=100000; 4*a(1)" | bc -lq &

[3]- Running echo "scale=100000; 4*a(1)" | bc -lq &

[4]+ Running echo "scale=100000; 4*a(1)" | bc -lq &

[root@study ~]# kill -9 %1 %2 %3 %4

# 這時先用 jobs 找出背景工作,再使用 kill 刪除掉四個背景工作後,慢慢等待工作負載的下降

[root@study ~]# uptime; atq

20:01:33 up 2 days, 19:59, 2 users, load average: 0.89, 2.29, 1.40

4 Thu Jul 30 19:57:00 2015 b root

[root@study ~]# uptime; atq

20:02:52 up 2 days, 20:01, 2 users, load average: 0.23, 1.75, 1.28

# 在 19:59 時,由於 loading 還是高於 0.8,因此 atq 可以看得到 at job 還是持續再等待當中喔!

# 但是到了 20:01 時, loading 降低到 0.8 以下了,所以 atq 就執行完畢囉!

使用 uptime 可以觀察到 1, 5, 15 分鐘的『平均工作負載』量,因為是平均值,所以當我們如上表刪除掉四個工作後,工作負載不會立即降低,

需要一小段時間讓這個 1 分鐘平均值慢慢回復到接近 0 啊!當小於 0.8 之後的『整分鐘時間』時,atd 就會將 batch 的工作執行掉了!

什麼是『整分鐘時間』呢?不論是 at 還是底下要介紹的 crontab,他們最小的時間單位是『分鐘』,所以,基本上,他們的工作是『每分鐘檢查一次』來處理的!

就是整分 (秒為 0 的時候),這樣瞭解乎?同時,你會發現其實 batch 也是使用 atq/atrm 來管理的!

linux 例行性工作,鳥哥的 Linux 私房菜相关推荐

  1. linux 例行性工作,Linux例行性工作

    Linux例行性工作 Linux:例行性工作 什么是例行性工作? 其实对于例行性工作而言就是在当前环境下周期性进行的必须工作. 在Linux下,有2种例行性工作种类: 一种是突发性,做完以后就没有的那 ...

  2. RHCE第一天之Linux例行性工作at、crontab详解

    文章目录 一.学习内容总结 1.单一执行的例行性工作at 2.循环执行的例行性工作crontab 二.作业 at和crontab的使用 一.学习内容总结 1.单一执行的例行性工作at 概念: 指仅处理 ...

  3. Linux例行性工作之系统配置文件(用户级crontab -e与系统级/etc/crontab)

    简介 crontab命令用于设置周期性被执行的指令.初次接触这个命令,这个命令的英文意思就是定时任务的意思.这个功能分为系统级和用户级,下面分别对系统级和用户级的配置作一个简单的说明: 用户级 使用c ...

  4. Linux学习笔记39——任务调度:什么是例行性工作调度、仅执行一次的工作调度、循环执行的例行性工作调度、可唤醒停机期间的工作任务

    一.什么是例行性工作调度 1,Linux 工作调度的种类: at, cron 2,CentOS Linux 系统上常见的例行性工作 二,仅执行一次的工作调度 1,atd 的启动与 at 运行的方式 a ...

  5. 鸟哥的Linux私房菜(基础篇)- 第十六章、例行性工作排程 (crontab)

    第十六章.例行性工作排程 (crontab) 最近升级日期:2009/09/11 学习了基础篇也一阵子了,你会发现到为什么系统常常会主动的进行一些任务?这些任务到底是谁在配置工作的?如果你想要让自己设 ...

  6. Linux高级课程----Linux的例行性工作和chrony服务器

    Linux的例行性工作 1.单一的例行性工作:仅处理执行一次就结束了,at -> atd 我们使用 at 命令来生成所要运行的工作,并将这个工作,以文本方式写入/var/spool/at/ 目录 ...

  7. Linux的例行性工作

    在Linux后台中有许多的默认执行的系统服务,就像我们Windows开机时就有一个exeplorer.exe默认运行,这些系统服务称为系统守护进程. 接下来介绍两个比较重要的系统守护进程atd和cro ...

  8. Linux上使用at单一执行例行性工作,使用crontab循环执行例行性任务以及系统例行任务

    在工作或学习中,我们经常需要对重要的文件进行备份,或者做一些日常性的排查等工作,了解如何在linux上执行例行性工作显得尤为重要! 本文基于Linux上CentOS 7版本进行演示 一.单一执行例行性 ...

  9. 【树莓派不吃灰】Linux篇⑩ 学习例行性工作排程(核心概念)

    目录 1. 什么是例行性工作排程 2. 仅运行一次的工作排程 3. 循环运行的例行性工作排程 4. 可唤醒停机期间的工作任务 5. 重点回顾 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好 ...

最新文章

  1. Struts2.0下的客户端验证
  2. [网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
  3. Qt编写数据可视化大屏界面电子看板12-数据库采集
  4. php接收文件,如何通过php 发送与接收流文件
  5. mysql执行语句后回退_MySQL命令学习笔记(八)
  6. 前端:CSS/15/全局CSS设置,常用的兼容性调试技巧,CSSHACK
  7. 如何使用自动化与分析工具库创建 Excel 直方图
  8. 关机应用程序无法关闭计算机,电脑关机时怎么设置自动结束没有响应的应用程序?...
  9. 大型分布式网站术语分析
  10. Android Verified Boot 2.0 安卓P AVB实现详解
  11. 超定方程组及其求解方法
  12. 华为推送服务内容,阅读笔记
  13. 蒟蒻的noip2015滚粗记
  14. 红米3 android 版本升级失败,疑似官方推送错误固件 红米Note3全网通升级后变砖...
  15. 有人云平台全面升级!“旧词新释”秒懂物联网云平台的奥秘
  16. php提交按钮快捷键,直接打印快捷键
  17. jmeter参数化时常用随机函数
  18. 圣诞要到了~教你用Python制作一个表白神器——照片墙,祝你成功
  19. 2020年笔记本电脑计算机专业,适合女生用的笔记本电脑排名2020
  20. 成长的模式:如何从毕业生到技术专家?

热门文章

  1. linux xorg 文件 位置,Linux系统中xorg.conf文件详细介绍
  2. 华为鸿蒙系统议论文素材,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  3. PostgreSQL体系结构之物理结构
  4. np生成多维数组数组比较
  5. T-sne可视化digits
  6. Python机器学习:SVM006什么是核函数?
  7. 计算机二级等级考试模拟试题,2016年计算机二级考试office模拟试题
  8. 不重启修改计算机名称,批处理不重启快速修改计算机名
  9. SpringCloud Gateway 服务网关,限流
  10. Java 算法 邮票