Linux 設(shè)置定時(shí)任務(wù)常用的三種方法
發(fā)布時(shí)間:2024-01-31 13:49:10
1、使用 cron 設(shè)置定時(shí)任務(wù)
cron 是 Linux 中最常用的定時(shí)任務(wù)調(diào)度器。它允許用戶在指定的日期和時(shí)間運(yùn)行腳本和命令。使用 cron 設(shè)置定時(shí)任務(wù)的三種方法如下,
1)編輯用戶的 crontab 文件
用于單個(gè)用戶設(shè)置定時(shí)任務(wù),打開(kāi)用戶的 crontab
文件,命令如下,
crontab -e
在 crontab 文件中,添加一行來(lái)定義定時(shí)任務(wù),格式如下,
分 時(shí) 日 月 周 命令
例如,
每天凌晨3點(diǎn)運(yùn)行腳本,如下,
0 1 * * * /path/to/script.sh
添加完成后,保存文件退出。
2)使用預(yù)定義的 cron 目錄
Linux 系統(tǒng)通常包含一些預(yù)定義的目錄,用于存放定期執(zhí)行的腳本,目錄如下,
/etc/cron.daily /etc/cron.hourly /etc/cron.weekly /etc/cron.monthly
系統(tǒng)將按照目錄名稱指定的頻率執(zhí)行這些腳本。另外還需要將腳本添加執(zhí)行權(quán)限。例如,
chmod +x /path/to/script.sh
3)在 /etc/crontab 文件中添加任務(wù)
對(duì)于系統(tǒng)級(jí)的任務(wù),可以直接在 /etc/crontab
文件中添加,添加方法和用戶的crontab
文件中添加方法差不多,但多了一個(gè)用戶的字段,格式如下,
分 時(shí) 日 月 周 用戶 命令
例如,
以 root 每天凌晨3點(diǎn)運(yùn)行腳本,如下,
0 3 * * * root /path/to/script.sh
2、使用 at 設(shè)置定時(shí)任務(wù)
用于設(shè)置一次性任務(wù),它會(huì)在指定的時(shí)間運(yùn)行一次任務(wù)。它允許指定將在未來(lái)某個(gè)時(shí)間點(diǎn)執(zhí)行的命令。
1)安裝 at
在某些 Linux 發(fā)行版中,at 服務(wù)可能默認(rèn)沒(méi)有安裝。您可以使用包管理器進(jìn)行安裝:
對(duì)于基于 Debian/Ubuntu 的系統(tǒng):
sudo apt-get install at
對(duì)于基于 RedHat/CentOS 的系統(tǒng):
sudo yum install at
2)啟動(dòng) at 服務(wù)
啟動(dòng)并設(shè)置開(kāi)機(jī)自動(dòng)啟動(dòng):
sudo systemctl start atd sudo systemctl enable atd
3)使用 at 設(shè)置定時(shí)任務(wù)
使用 at
后跟執(zhí)行任務(wù)的時(shí)間來(lái)設(shè)置定時(shí)任務(wù)。at
接受多種時(shí)間格式,例如,
在今天下午 10:30 執(zhí)行腳本:
echo "/path/to/script.sh" | at 22:30
在當(dāng)前時(shí)間之后的 30 分鐘執(zhí)行腳本:
echo "/path/to/script.sh" | at now + 30 minutes
4)管理 at 任務(wù)
列出待執(zhí)行的 at
任務(wù),使用命令如下,
atq
刪除 at
任務(wù),使用命令如下,
atrm <job number>
可以查看任務(wù)腳本中指定的日志文件或輸出文件,來(lái)檢查任務(wù)執(zhí)行狀態(tài)。
3、使用 systemd 定時(shí)器設(shè)置定時(shí)任務(wù)
systemd 定時(shí)器是一種替代傳統(tǒng) cron 的方法,用于安排定時(shí)任務(wù)。systemd 定時(shí)器由兩部分組成:一個(gè) .service
文件和一個(gè) .timer
文件。.service
文件定義了要執(zhí)行的任務(wù),而 .timer
文件設(shè)定了何時(shí)執(zhí)行這個(gè)任務(wù)。
1)創(chuàng)建服務(wù)文件
創(chuàng)建一個(gè) .service 文件來(lái)定義要執(zhí)行的任務(wù)。例如,
創(chuàng)建 /etc/systemd/system/mytask.service
文件,內(nèi)容如下,
[Unit] Description=checkIP [Service] Type=simple ExecStart=/root/chechIP.sh
腳本添加執(zhí)行權(quán)限:
chmod +x /root/chechIP.sh
2)創(chuàng)建 .timer 文件
.service
文件創(chuàng)建完成后,還需要?jiǎng)?chuàng)建一個(gè)定時(shí)器文件(.timer
),例如,
創(chuàng)建 /etc/systemd/system/mytask.timer 文件,內(nèi)容如下,
[Unit] Description=checkIP every 30s [Timer] OnActiveSec=60 OnUnitActiveSec=30 Unit=mytask.service [Install] WantedBy=multi-user.target
systemd 定時(shí)器可用選項(xiàng):
選項(xiàng) | 描述 |
OnActiveSec | 定時(shí)器生效后,多少時(shí)間開(kāi)始執(zhí)行任務(wù)。 如, OnUnitActiveSec=1h表示一小時(shí)執(zhí)行一次任務(wù), OnUnitActiveSec=*-*-* 02:00:00表示每天凌晨?jī)牲c(diǎn)執(zhí)行, OnUnitActiveSec=Mon *-*-* 02:00:00表示每周一凌晨?jī)牲c(diǎn)執(zhí)行。 |
OnBootSec | 系統(tǒng)啟動(dòng)后,多少時(shí)間開(kāi)始執(zhí)行任務(wù)。 |
OnStartupSec | Systemd 進(jìn)程啟動(dòng)后,多少時(shí)間開(kāi)始執(zhí)行任務(wù)。 |
OnUnitActiveSec | 該單元上次執(zhí)行后,等多少時(shí)間再次執(zhí)行。 |
OnUnitInactiveSec | 定時(shí)器上次關(guān)閉后多少時(shí)間,再次執(zhí)行。 |
OnCalendar | 基于絕對(duì)時(shí)間,而不是相對(duì)時(shí)間執(zhí)行。 如, OnCalendar= OnCalendar= OnCalendar= |
AccuracySec | 如果任務(wù)必須推遲執(zhí)行,推遲的最大秒數(shù),默認(rèn)是 60 秒。 |
Unit | 要執(zhí)行的實(shí)際任務(wù), 通常是同名的帶有 .service 后綴的單元。 |
Persistent | 如果設(shè)置了該字段, 即使定時(shí)器到時(shí)沒(méi)有啟動(dòng), 也會(huì)自動(dòng)執(zhí)行相應(yīng)的單元。 |
WakeSystem | 如果系統(tǒng)休眠,是否自動(dòng)喚醒系統(tǒng)。 |
3)定時(shí)器使用相關(guān)命令
操作 | 命令 |
重新加載 systemd 配置 | sudo systemctl daemon-reload |
啟動(dòng)定時(shí)器 | sudo systemctl start mytask.timer |
設(shè)置定時(shí)器在啟動(dòng)時(shí)自動(dòng)啟動(dòng) | sudo systemctl enable mytask.timer |
查看定時(shí)器狀態(tài) | systemctl status mytask.timer |
列出所有定時(shí)器 | systemctl list-timers |
查看日志(調(diào)試或檢查任務(wù)執(zhí)行情況) | journalctl -u mytask.service |