షెడ్యూల్ చేసిన టాస్క్లు: 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 విజయవంతమైన దానిలా సరిగ్గా అదేలా కనిపిస్తుంది. 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