تایمرهای systemd را جایگزین cron کردم
سالها هر کار زمانبندیشدهای را با cron انجام میدادم. ساده است و همهجا هست. ولی وقتی تعداد کارها زیاد شد و لازم شد بدانم هر کدام دقیقاً کِی و با چه نتیجهای اجرا شده، کمکم به مشکل خوردم. این چند وقت سراغ تایمرهای systemd رفتم و دیگر برنگشتم.
مشکل من با cron چه بود؟
سه چیز اذیتم میکرد:
- دیدن لاگ هر کار جداگانه دردسر داشت؛ خروجیها معمولاً به ایمیل یا یک فایل پرت میشدند.
- اگر سرور موقع اجرای کار خاموش بود، آن اجرا بهسادگی از دست میرفت.
- وابستگی بین کارها (اول این، بعد آن) عملاً ممکن نبود.
ساختار یک تایمر
هر تایمر در واقع دو فایل است: یک .service که میگوید چه چیزی اجرا شود و یک .timer که میگوید کِی. مثلاً یک بکاپ شبانه:
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly database backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup every night
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.target
آن Persistent=true همان چیزی است که cron نداشت: اگر سرور موقع ۲:۳۰ خاموش بود، بهمحض روشنشدن کارِ ازدسترفته اجرا میشود.
فعالکردن و دیدن وضعیت
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
# تایمرهای فعال را ببین
systemctl list-timers
چیزی که بیشتر از همه دوستش دارم این است که لاگ هر اجرا مستقیم در journal است:
journalctl -u backup.service --since today
دیگر لازم نیست خروجی را خودم به فایل redirect کنم؛ همهچیز یکجا و قابل فیلتر است.
کِی هنوز سراغ cron میروم؟
برای یک کار سرراست روی سیستمی که فقط cron دارد (مثلاً یک کانتینر سبک)، هنوز همان یک خط cron منطقیتر است. ولی روی هر سروری که systemd دارد، تایمرها برایم برندهاند.