亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Crontab是linux下定時(shí)調(diào)度配置文件,通過(guò)它,我們可以讓系統(tǒng)的程序、腳本、命令、任務(wù)按設(shè)定的時(shí)間、間隔、周期循環(huán)的運(yùn)行。 在Crontab里時(shí)間粒度最小的是分鐘。也就是說(shuō),通過(guò)Crontab配置,我們最多可以讓目標(biāo)任務(wù)每分鐘執(zhí)行一次,更頻繁的執(zhí)行是不行的,只能借助其它方法。

比如說(shuō),如果希望一個(gè)程序每30秒執(zhí)行一次,該怎么辦呢?

變通的方法還是有的。 一種思路是,在Crontab里添加兩條配置,一條是正常調(diào)度,每分鐘執(zhí)行一次,另一條是等待30秒后才執(zhí)行。

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

這種方法感覺(jué)有點(diǎn)生硬,怪怪的,但的確可行。這種方法實(shí)際是可以簡(jiǎn)寫成一行:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

還有一種方法是使用watch命令:

$ watch --interval .30 script_to_run_every_30_sec.sh

但watch是命令行工具,我們可以使用nohup命令讓它在后臺(tái)運(yùn)行。

SystemD定時(shí)器

如果我們使用的linux系統(tǒng)里有SystemD,可以使用SystemD定時(shí)器在任何時(shí)間粒度上調(diào)度程序,理論上可以小到納秒級(jí)別——當(dāng)然,這樣做有點(diǎn)瘋狂??傊?,它在任務(wù)調(diào)度上的靈活性遠(yuǎn)比Cron要高——無(wú)需使用sleep這種蹩腳的方案。

比起一行完成配置的crontab來(lái)說(shuō),建立一個(gè)SystemD定時(shí)器會(huì)顯得稍微復(fù)雜一些,但為了更好的實(shí)現(xiàn)小于‘每分鐘’粒度的調(diào)度任務(wù),這種方法值得嘗試。

SystemD定時(shí)器實(shí)現(xiàn)原理簡(jiǎn)單說(shuō)就是兩部分:一個(gè)系統(tǒng)service,一個(gè)SystemD定時(shí)器。SystemD定時(shí)器執(zhí)行調(diào)度,而任務(wù)是寫在service里。

下面有個(gè)簡(jiǎn)單的例子,目標(biāo)是讓系統(tǒng)logger每十秒鐘輸出一次“Hello World”;

/etc/systemd/system/helloworld.service

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.targethelloworld.timer里并沒(méi)有聲明service的名稱,那它和service是如何關(guān)聯(lián)的呢?沒(méi)錯(cuò),因?yàn)樗鼈兊拿Q相同,都是helloworld。

如果想讓整個(gè)系統(tǒng)使用這個(gè)定時(shí)器,這兩個(gè)文件就需要放置在/etc/systemd/system下。如果想給某個(gè)用戶使用,則放置在~/.config/systemd/user。想讓這個(gè)定時(shí)器立即運(yùn)行,需要執(zhí)行下面的命令:

systemctl enable --now helloworld.timer

里面的–now標(biāo)記是讓定時(shí)器立即執(zhí)行。否則,只有等系統(tǒng)重啟后,或者用戶登錄是才會(huì)觸發(fā)運(yùn)行。

[Timer]部分里的各個(gè)字段的作用如下:

OnBootSec – 系統(tǒng)啟動(dòng)多少秒后開(kāi)始執(zhí)行調(diào)度

OnUnitActiveSec – 重復(fù)調(diào)度相關(guān)service的時(shí)間間隔。就是這行配置決定了跟cron job一樣定時(shí)調(diào)度的動(dòng)作。

AccuracySec – 定時(shí)器精度。 默認(rèn)是一分鐘,跟cron很相似??梢砸蟮母?,但精度增加會(huì)帶來(lái)更多系統(tǒng)的消耗,更頻繁的喚醒CPU。上面的配置里寫的是1ms,顯然不是個(gè)聰明的決定。通常我們可以把它設(shè)置為 1(1秒),對(duì)于我們這樣低于1分鐘時(shí)間粒度的定時(shí)器的精度要求已經(jīng)夠用了。也是因?yàn)槿绱?,我們?huì)看到,實(shí)際程序運(yùn)行時(shí)輸出“Hello World”消息的時(shí)間經(jīng)常會(huì)延遲1秒左右。如果你認(rèn)為這一秒左右的延遲不是問(wèn)題,那就應(yīng)該這樣設(shè)定。

你會(huì)發(fā)現(xiàn),SystemD定時(shí)器和Crontab定時(shí)器并不是一樣的——任務(wù)調(diào)度的周期并不是按年月日小時(shí)分鐘周期設(shè)定的,它是按我們第一次執(zhí)行它的時(shí)間開(kāi)始,每次追加一個(gè)周期的時(shí)間。如果我們鐘情于Crontab那樣的時(shí)間配置方式,SystemD定時(shí)器也是支持的,那就需要把OnBootSec和OnUnitActiveSec去掉,換成OnCalendar,下面是一個(gè)例子:

OnCalendar=*-*-* *:*:00,10,20,30,40,50

最后補(bǔ)充一點(diǎn),默認(rèn)情況下,SystemD定時(shí)器和service的關(guān)聯(lián)是通過(guò)相同的名稱,如果你愿意,也可以在[Timer]配置里通過(guò)指定Unit字段配對(duì)。

上面的幾種方法都可以實(shí)現(xiàn)低于分鐘粒度的定時(shí)調(diào)度任務(wù)。各有優(yōu)點(diǎn)。SystemD定時(shí)器看起來(lái)更正規(guī),但稍微復(fù)雜了一點(diǎn)。Crontab+sleep方式雖然別扭,但對(duì)于一些小任務(wù)來(lái)說(shuō)沒(méi)有不能勝任的。

分享到:
標(biāo)簽:Crontab
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定