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