真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux定時(shí)任務(wù)的檢查方式是什么

這篇文章主要介紹“Linux定時(shí)任務(wù)的檢查方式是什么”,在日常操作中,相信很多人在Linux定時(shí)任務(wù)的檢查方式是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Linux定時(shí)任務(wù)的檢查方式是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站2013年開(kāi)創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元安龍做網(wǎng)站,已為上家服務(wù),為安龍各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

## Crontab

大多數(shù)人都用過(guò) Crontab:crontab -e / -l,所以這里就不介紹了,也不贅述使用方式了。

要想完整的列出 crontab,最好還是從 crontab 保存的定時(shí)任務(wù)文件入手。

### Crontab 相關(guān)的文件

Crontab 相關(guān)的文件分別在 /etc、/var/spool/cron/ 下:

  1. /etc/

    1. /etc/cron.hourly/0anacron: anacron 下面會(huì)講

    2. /etc/cron.d/0hourly: 自帶的,其實(shí)就是用 run-parts 去執(zhí)行 /etc/cron.hourly 下面的腳本

    3. ...(可能有其他用戶把定時(shí)任務(wù)放在這下面)

    4. /etc/cron.allow: 相當(dāng)于白名單,限制類配置,不在這里面的用戶不能使用 crontab

    5. /etc/cron.deny: 相當(dāng)于黑名單,限制類配置,在這里面的用戶不能使用 crontab

    6. /etc/crontab: 系統(tǒng)級(jí)別的定時(shí)任務(wù)配置,可以理解為大家一起用的定時(shí)任務(wù),所有權(quán)是系統(tǒng)而不是特定的某用戶

    7. /etc/cron.d/: 這個(gè)文件夾下的配置同 /etc/crontab。假如你有個(gè)定時(shí)任務(wù)不想直接寫到 /etc/crontab里,那么你可以選擇新建一個(gè)文件,放在 /etc/cron.d/ 里面(無(wú)需其他配置,直接生效)。

    8.  /etc/cron.hourly/: 被 /etc/cron.d/0hourly 執(zhí)行。里面是可執(zhí)行文件或者 shell 腳本。

    9.  /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly: 看起來(lái)和 crontab 有關(guān)系?其實(shí)是 anacron的!下面會(huì)講

  2.  /var/spool/cron/: 存放每個(gè)用戶的 crontab,所有權(quán)是特定的用戶(注意與 /etc/crontab 對(duì)比)。這個(gè)就是我們?cè)谟?crontab -e 的時(shí)候創(chuàng)建/編輯的文件,所以文件名就是用戶名,并且執(zhí)行的時(shí)候是用文件名(即用戶名)的權(quán)限來(lái)執(zhí)行的,例如你在下面建了一個(gè)名叫 Tr0y 的文件,則會(huì)以 Tr0y 的身份去執(zhí)行這個(gè)文件里的定時(shí)任務(wù)。需要注意的是,如果你在這個(gè)目錄下強(qiáng)行創(chuàng)建了一個(gè)以不存在的用戶名為命名的文件,例如 test,但是你又沒(méi)有這個(gè)用戶的話,test 里面的定時(shí)任務(wù)是不會(huì)執(zhí)行的。另一個(gè)需要注意的是,/var/spool/cron/ 的所有權(quán)是 root,所以普通用戶是沒(méi)辦法直接在下面創(chuàng)建文件的,只能加 sudo 或者通過(guò) crontab -e。

    1.  ...(各個(gè)用戶的 crontab)

注意,/etc/cron.allow 的優(yōu)先級(jí)比 /etc/cron.deny 要高,所以配置只需要選擇一種來(lái)限制即可。一般來(lái)說(shuō),系統(tǒng)的用戶相對(duì)可靠,故默認(rèn)保留的是 /etc/cron.deny,且內(nèi)容為空,這樣所有人都能用 crontab。如果這兩個(gè)限制文件都不存在,那么只有 root 才能使用 crontab。

最后需要注意的是,cron 是不會(huì)遞歸文件夾的,所以你在 /etc/cron.d/ 和 /var/spool/cron/ 下面建文件夾,再在里面放配置文件是沒(méi)用的。為什么要特別提到這一點(diǎn)?因?yàn)槲乙?jiàn)過(guò)有攻擊者這么干過(guò)...

### 防御建議

1. 使用 /etc/cron.allow 來(lái)指定可使用 crontab 的用戶(最好不要使用黑名單的/etc/cron.deny)。需要注意的是,此文件一定要是 root 所有。
2. 檢查 crontab 的時(shí)候,分別檢查:/etc/crontab、/etc/cron.d/*、/var/spool/cron/*。
3. 檢查是否有除了 /etc/cron.hourly/0anacron 之外的 anacron 定時(shí)任務(wù)(下面會(huì)提)

## Anacron

Anacron 可能大家用的少一點(diǎn),所以會(huì)說(shuō)的多一些。

它與 Crontab 最大的不同在于,它會(huì)去執(zhí)行那些落下的定時(shí)任務(wù)。舉個(gè)例子,假如你設(shè)定了一個(gè) Crontab 定時(shí)任務(wù),在每周六晚上 6 點(diǎn)執(zhí)行。但是正好周六晚上 5 點(diǎn)到 7 點(diǎn)停電了,那么這個(gè)定時(shí)任務(wù)相當(dāng)于這一輪就沒(méi)有執(zhí)行。但是如果你用的是 Anacron,它會(huì)去檢查并執(zhí)行那些沒(méi)有執(zhí)行過(guò)的定時(shí)任務(wù)。實(shí)際上,Anacron 是每個(gè)小時(shí)被 crond(Crontab 服務(wù))執(zhí)行一次,然后 Anacron 再去檢測(cè)相關(guān)的定時(shí)任務(wù)有沒(méi)有被執(zhí)行,如果有超期沒(méi)被執(zhí)行的工作,就執(zhí)行該定時(shí)任務(wù)。

Anacron 其實(shí)僅僅是一個(gè)程序,不像 Crontab 那樣利用 crond 服務(wù)執(zhí)行。之前在 Crontab 里提到過(guò),有個(gè)自帶的每一個(gè)小時(shí)執(zhí)行一次的定時(shí)任務(wù)集 合:/etc/cron.d/0hourly,而這個(gè)定時(shí)任務(wù)其實(shí)就是用 run-parts 去執(zhí)行 /etc/cron.hourly 下面的腳本,這里面自帶一個(gè) 0anacron,其實(shí)就是這一節(jié)提到的 Anacron。所以 Anacron 其實(shí)是依托于 Crontab 去定時(shí)執(zhí)行的。0anacron 如下:

#!/bin/sh
# Check whether 0anacron was run today already
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

# --- 上面這部分就是我說(shuō)的檢測(cè)定時(shí)任務(wù)是否執(zhí)行過(guò)的邏輯 ---

# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power >/dev/null 2>&1
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

# 所以這個(gè)腳本其實(shí)執(zhí)行的就是 anacron -s...

各位可能會(huì)覺(jué)得很奇怪,為啥這個(gè)名字最前面要加個(gè) 0。根據(jù)網(wǎng)上的說(shuō)法,0 開(kāi)頭的定時(shí)任務(wù)會(huì)排在最前面執(zhí)行,這樣的話,就避免了有些 Crontab 定時(shí)任務(wù)執(zhí)行過(guò)之后,Anacron 誤以為 Crontab 沒(méi)執(zhí)行,導(dǎo)致重復(fù)執(zhí)行某些定時(shí)任務(wù)。包括命令之前加上 nice 讓它優(yōu)先獲得 cpu 以便執(zhí)行,也是出于這個(gè)目的。

### Anacron 的相關(guān)文件

  1. /etc/anacrontab: 與 /etc/crontab 類似,自帶,通過(guò) run-parts 執(zhí)行 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly。

  2. /var/spool/anacron/: 記錄上面幾個(gè)的執(zhí)行時(shí)間,內(nèi)容就是年月日

    1. /var/spool/anacron/cron.daily

    2. /var/spool/anacron/cron.monthly

    3. /var/spool/anacron/cron.weekly

  3.  anacrontab 可以通過(guò) -t 參數(shù)指定 /etc/anacrontab 的位置,默認(rèn)就是 /etc/anacrontab

簡(jiǎn)單解釋一下 /etc/anacrontab 的內(nèi)容吧:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45         # 執(zhí)行之前隨機(jī)延遲時(shí)間(分鐘,可分散服務(wù)器的壓力)
START_HOURS_RANGE=3-22  # 允許執(zhí)行命令的時(shí)間段(這里是 3 點(diǎn) - 22 點(diǎn)才能執(zhí)行)

1                 5        cron.daily         nice run-parts /etc/cron.daily

# 1: 每隔多久執(zhí)行(天)
# 5: 固定延遲時(shí)間(分鐘)
# cron.daily: 定時(shí)任務(wù)名稱,隨便設(shè)置,主要是看 log (/var/log/cron 的時(shí)候可能有用)
# nice run-parts /etc/cron.daily: 定時(shí)任務(wù)的核心 —— 要執(zhí)行的命令

與 /etc/cron.d/0hourly 挺像的,同時(shí)名字最前面加 0 這個(gè)邏輯也是一樣的。

  1. 以 cron.daily 為例,對(duì)照上面這個(gè)配置,總結(jié)一下 Anacron 的運(yùn)行流程:
    crond 讀取 /etc/crontab、/var/spool/cron/*、/etc/cron.d/*,根據(jù)設(shè)定的時(shí)間執(zhí)行

  2. 執(zhí)行到 /etc/cron.d/0hourly 的時(shí)候,執(zhí)行 /etc/cron.hourly/ 下的所有可執(zhí)行文件,其中就有 0anacron

  3. 0anacron 執(zhí)行 anacron

  4. anacron 讀取 /etc/anacrontab,它指定了 cron.daily 執(zhí)行間隔為 1 天

  5. 從 /var/spool/anacron/cron.daily 取出最近一次執(zhí)行 anacron 的時(shí)間

  6. 比較當(dāng)前時(shí)間與上一步獲得的時(shí)間,若相差 1 天以上 (含 1 天),則準(zhǔn)備執(zhí)行指定的定時(shí)任務(wù)。

  7. 根據(jù) /etc/anacrontab 的設(shè)置,執(zhí)行之前要先延時(shí) 5 分鐘 + n 分鐘(n 為不超過(guò) 45 的隨機(jī)數(shù))

  8. 延時(shí)到點(diǎn)之后,開(kāi)始執(zhí)行指定的命令,即 nice run-parts /etc/cron.daily

  9. 執(zhí)行完畢,結(jié)束

最后,anacrontab 僅能用 root 權(quán)限配置。

### 防御建議

anacrontab 的執(zhí)行比較佛系,最快也就是一天執(zhí)行一次(除非加上了-f,強(qiáng)制每輪檢查都執(zhí)行),所以惡意軟件通常不想用這個(gè)去做持久化。不過(guò)也不好說(shuō),誰(shuí)讓它比 crontab 隱蔽呢?

  1. 檢查 /etc/anacrontab 下是否有疑似惡意的定時(shí)任務(wù)

  2. 檢查 /etc/cron.hourly/0anacron 是否利用-t自定義了 anacrontab 定時(shí)任務(wù)文件位置,如果有也要檢查這個(gè)自定義的文件。

## at

at 依賴于 atd 服務(wù)執(zhí)行,這點(diǎn)與 crontab 有點(diǎn)像,但現(xiàn)在似乎不是默認(rèn)啟用 atd 的,所以可能需要手動(dòng)啟動(dòng)(systemctl start atd)。它與前兩個(gè)最大的區(qū)別在于 at 是一次性的,設(shè)定完之后只會(huì)運(yùn)行一次。

### at 的相關(guān)文件

  1. /etc/at.allow: 相當(dāng)于白名單,限制類配置,不在這里面的用戶不能使用 at

  2. /etc/at.deny: 相當(dāng)于黑名單,限制類配置,在這里面的用戶不能使用 at

  3. /var/spool/at/: 保存定時(shí)任務(wù)的文件夾。下面用特定格式的文件名存放定時(shí)任務(wù)詳情,包括命令、環(huán)境變量、設(shè)定定時(shí)任務(wù)時(shí)的路徑等。

    1. /var/spool/at/spool: 據(jù)說(shuō)是保存輸出的文件夾...至于是什么輸出、什么時(shí)候會(huì)輸出到這里就不得而知了...

    2. 示例:a000030196c020。這個(gè)文件名的格式暫時(shí)沒(méi)找到資料,不過(guò)經(jīng)過(guò)我的測(cè)試,格式應(yīng)該為,a(固定)+00011(任務(wù)每加一個(gè)這里要+1)+從 1970-01-01 08:00:00 至 任務(wù)執(zhí)行時(shí)間 的分鐘數(shù)(8 位,位數(shù)不夠在前面補(bǔ) 0) (注意這里面計(jì)算都是十六進(jìn)制的)

上面的兩個(gè)限制文件個(gè) crontab 類似,也是 allow 的優(yōu)先級(jí)比 deny 要高,如果這兩個(gè)限制文件都不存在,那么只有 root 才能使用 at。

當(dāng)然,你也可以不用 at 來(lái)新建定時(shí)任務(wù),只要往 /var/spool/at/ 下面新建文件,注意權(quán)限要有 x,且得是 root 才能這么創(chuàng)建,至于文件名,一定要按照上面的規(guī)則才能被識(shí)別。示例,若我們想建一個(gè)在 2030-01-01 08:00:00 執(zhí)行的定時(shí)任務(wù)。先計(jì)算一下時(shí)間差:

In [27]: import datetime

In [28]: delta = datetime.datetime.strptime('2030-01-01 08:00:00', "%Y-%m-%d %H:%M:%S") - datetime.datetime.strptime('1970-01-01 0
    ...: 8:00:00', "%Y-%m-%d %H:%M:%S")

In [29]:  hex(delta.days * 24 * 60)  # 轉(zhuǎn)分鐘
Out[29]: '0x1e187e0'

補(bǔ)齊至 8 位:01e187e0。

所以這個(gè)定時(shí)任務(wù)的格式應(yīng)該為 a+00012(上一個(gè)任務(wù)+1)+01e187e0(時(shí)間差) = a0001201e187e0:

?  at atq
?  at vim a0001201e187e0
?  at atq
18 Tue Jan  1 08:00:00 2030 a root

各位如果比較敏感的話,就會(huì)想到 8 位的 hex,會(huì)不會(huì)出現(xiàn)類似千年蟲(chóng)的 bug 呢?0xffffffff = 4294967295 年,43 億年,嗯,各位是等不到了。

最后有幾點(diǎn)要提一下:

  1. 如果 at 定時(shí)任務(wù)執(zhí)行沒(méi)有成功,似乎會(huì)變成=開(kāi)頭的定時(shí)任務(wù)(原來(lái)是a開(kāi)頭的)

  2. 執(zhí)行時(shí)間在過(guò)去的定時(shí)任務(wù)是不會(huì)被執(zhí)行的

  3. 在直接寫 at 定時(shí)任務(wù)的時(shí)候,要注意開(kāi)頭要有這三行:

#!/bin/sh            # shell
# atrun uid=0 gid=0  # 應(yīng)該是表明計(jì)劃任務(wù)的擁有者的權(quán)限,未考證
# mail root 0        # 觸發(fā)發(fā)郵件的邏輯時(shí),收件人是誰(shuí)

      4. 與 at 相關(guān)的還有一個(gè) batch 命令,通過(guò)它設(shè)定的 at 定時(shí)任務(wù),只有在 cpu 負(fù)載小于 0.8 的時(shí)候才會(huì)運(yùn)            行,且文件名則會(huì)以 b 開(kāi)頭。其實(shí)原理都是一樣的,batch 也是用 at 來(lái)配置定時(shí)任務(wù)的:

?  at echo 'echo <0001f382> > /dev/pts/8' | batch && ls
job 32 at Mon Aug  3 17:35:00 2020
b000200195ff5f  spool

at 的可讀性還是很好的,例如你可以給自己發(fā)一個(gè)生日祝福:

?  ~ echo 'echo <0001f382> > /dev/pts/8' | at 00:00 September 7
job 1 at Mon Aug  3 14:02:00 2020
?  ~ atq
1 Mon Sep  7 00:00:00 2020 a root
?  ~ ls /var/spool/at/
a000010195fe8a  spool
?  ~ cat /var/spool/at/a000010195fe8a
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
...
cd /root || {
  echo 'Execution directory inaccessible' >&2
  exit 1
}
...
echo <0001f382> > /dev/pts/8
...

到此,關(guān)于“Linux定時(shí)任務(wù)的檢查方式是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


分享名稱:Linux定時(shí)任務(wù)的檢查方式是什么
網(wǎng)站網(wǎng)址:http://weahome.cn/article/jeiegs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部