Skip to content
VDS · ऐप्स और बॉट

शेड्यूल्ड टास्क: cron और systemd टाइमर

शेड्यूल्ड टास्क कैसे चलाएँ, मैन्युअल रूप से टास्क क्यों चलता है पर cron में चुप रहता है, और systemd टाइमर पर कब स्विच करें।

23 अगस्त 2026 को अपडेट किया गया

बैकअप, सर्टिफ़िकेट रिन्यूअल, टेम्प फ़ाइल क्लीनअप, नाइटली रिपोर्ट — ये सब शेड्यूल्ड टास्क हैं। Linux पर आप इन्हें दो तरीक़ों से हल करते हैं: क्लासिक cron और systemd टाइमर।

Cron: क्विक स्टार्ट

आप किसी यूज़र का शेड्यूल ऐसे एडिट करते हैं:

crontab -e
crontab -l

लाइन का फ़ॉर्मैट पाँच फ़ील्ड और एक कमांड है:

# min  hour  day  month  day-of-week  command
  0    4    *     *      *            /usr/local/bin/backup.sh
  */15 *    *     *      *            /usr/local/bin/check.sh
  30   3    *     *      0            /usr/bin/systemctl restart myapp

काम के शॉर्टकट: @daily, @hourly, @reboot। यह चेक करने के लिए कि जॉब्स चले भी या नहीं:

grep CRON /var/log/syslog | tail -30
journalctl -u cron --since "1 hour ago"

स्क्रिप्ट हाथ से चलती है पर cron में क्यों नहीं

यह सबसे आम समस्या है, और इसकी वजह लगभग हमेशा तीन में से एक होती है।

अलग एनवायरनमेंट। Cron का PATH बहुत छोटा होता है और .bashrc से आपके कोई वेरिएबल नहीं आते। प्रोग्राम्स के पूरे पाथ इस्तेमाल करें और वेरिएबल्स स्क्रिप्ट के ऊपर या crontab में साफ़-साफ़ सेट करें:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

अलग डायरेक्टरी। जॉब यूज़र की होम डायरेक्टरी में शुरू होती है, इसलिए रिलेटिव पाथ कहीं और इशारा करते हैं। हमेशा एब्सोल्यूट पाथ इस्तेमाल करें।

आउटपुट कहीं नहीं जाता। एरर आया, पर किसी ने देखा ही नहीं। लॉग लिखें:

0 4 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

दो और छोटी बातें: cron लाइन में % कैरेक्टर को \% की तरह एस्केप करना ज़रूरी है, और crontab फ़ाइल का अंत न्यूलाइन पर होना चाहिए — वरना आख़िरी जॉब नज़रअंदाज़ हो जाती है।

आपको बाहर से वेरिफ़ाई करना होगा कि जॉब चली। चुपचाप चलने वाला cron बिल्कुल सफल cron जैसा दिखता है। Uptime Kuma में पुश चेक सेट करें: स्क्रिप्ट के अंत में एक एड्रेस पर पिंग होती है, और अगर एक दिन तक पिंग न आए तो आपको अलर्ट मिल जाता है।

systemd टाइमर

जब टास्क एक कमांड से ज़्यादा जटिल हो, तो टाइमर ज़्यादा सुविधाजनक है: इसमें जर्नल, डिपेंडेंसीज़, रिसोर्स लिमिट्स, और एक साथ दो कॉपी चलने से सुरक्षा होती है।

# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run nightly backup

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
RandomizedDelaySec=15m

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
journalctl -u backup.service -n 50

Persistent=true मशीन बंद रहने पर छूटी हुई रन को पकड़ लेता है — cron यह नहीं कर सकता। RandomizedDelaySec लोड फैला देता है ताकि दर्जन भर टास्क एक ही सेकंड में शुरू न हों।

किन बातों का ध्यान रखें

  • मशीन का समय डिफ़ॉल्ट रूप से UTC होता है। “सुबह 4 बजे” सेट करने से पहले timedatectl चेक करें।
  • भारी टास्क (आर्काइव, बैकअप वेरिफ़िकेशन) डिस्क-बाउंड होते हैं। डिस्क स्पीड देखें और इन्हें रात के लिए शेड्यूल करें।
  • हर पाँच मिनट चलने वाला लंबा टास्क ख़ुद से ओवरलैप हो जाएगा। systemd में Type=oneshot मदद करता है; cron में flock के ज़रिए लॉक इस्तेमाल करें:
*/5 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh