Crontab: Linux-இல் பணி அட்டவணையின் எடுத்துக்காட்டுகள், தொடரியல் மற்றும் பொதுவான பிழைகள்
Crontab என்பது cron டீமன் கட்டளைகளை இயக்கும் அட்டவணை: ஒவ்வொரு வரியும் ஐந்து நேரப் புலங்களையும் (நிமிடம், மணி, மாதத்தின் நாள், மாதம், வாரத்தின் நாள்) கட்டளையையும் கொண்டது; எடுத்துக்காட்டாக */5 * * * * /opt/backup.sh ஸ்கிரிப்டை ஒவ்வொரு 5 நிமிடத்துக்கும் இயக்கும். அட்டவணை crontab -e மூலம் திருத்தப்படுகிறது; பெரும்பாலான பிரச்சினைகள் cron-இன் குறைந்த சூழலிலிருந்து வருகின்றன: முழுமையான பாதைகளைக் குறிப்பிடுங்கள், வெளியீட்டை பதிவுக் கோப்புக்கு திருப்புங்கள்.
Cron என்பது Linux-இன் நிலையான பணித் திட்டமிடல்: cron டீமன் ஒவ்வொரு நிமிடமும் அட்டவணை கோப்புகளை (crontab) படித்து நேரம் வந்த கட்டளைகளை இயக்குகிறது. இரவில் காப்புப் பிரதிகள் எடுப்பது, தற்காலிகக் கோப்புகளை அழிப்பது, சான்றிதழ்களைப் புதுப்பிப்பது, அறிக்கைகளை அனுப்புவது — இவை எல்லாம் அதன் மூலம் நடக்கின்றன. கீழே தொடரியல், பொதுவான சந்தர்ப்பங்களுக்கான crontab எடுத்துக்காட்டுகள், பணி "அமைதியாக" இயங்காமல் போவதற்கான காரணங்களின் விளக்கம்.
crontab-ஐ திறப்பது மற்றும் திருத்துவது
ஒவ்வொரு பயனருக்கும் தனி அட்டவணை உண்டு. அதனுடன் crontab கட்டளை மூலம் வேலை செய்கிறார்கள், /var/spool/cron-இல் உள்ள கோப்புகளை நேரடியாகத் திருத்துவதில்லை:
| கட்டளை | என்ன செய்கிறது |
|---|---|
crontab -e | உங்கள் அட்டவணையை ஒரு திருத்தியில் திறக்கும் (முதல் முறை திருத்தி தேர்வு கேட்கும்) |
crontab -l | தற்போதைய அட்டவணையைக் காட்டும் |
crontab -r | அட்டவணையை முழுவதுமாக உறுதிப்படுத்தாமல் நீக்கும் |
crontab -i -r | உறுதிப்படுத்தலுடன் நீக்கும் (Debian/Ubuntu, RHEL) |
sudo crontab -u alice -e | இன்னொரு பயனரின் அட்டவணையைத் திருத்தும் |
crontab கோப்பு | அட்டவணையை கோப்பின் உள்ளடக்கத்தால் மாற்றும் |
crontab -e-இல் சேமித்த பிறகு அது தொடரியலைச் சரிபார்த்து crontab: installing new crontab என்று எழுதுகிறது. வரியில் பிழை இருந்தால் errors in crontab file, can't install தோன்றி மீண்டும் திருத்தச் சொல்லும். டீமனை மறுதொடக்கம் செய்ய வேண்டியதில்லை — மாற்றங்கள் தானாக எடுத்துக்கொள்ளப்படுகின்றன.
-r விஷயத்தில் கவனமாக இருங்கள்: e மற்றும் r விசைப்பலகையில் அருகருகே உள்ளன, அட்டவணைக்கு காப்புப் பிரதி இல்லை. பயனுள்ள பழக்கம் — ஒரு நகல் வைத்திருப்பது:
crontab -l > ~/crontab.bak
# மீட்டமைக்க
crontab ~/crontab.bak
crontab தொடரியல்: ஐந்து நேரப் புலங்கள்
ஒவ்வொரு பணி வரியும் இப்படி இருக்கும்:
# ┌───────── நிமிடம் (0–59)
# │ ┌─────── மணி (0–23)
# │ │ ┌───── மாதத்தின் நாள் (1–31)
# │ │ │ ┌─── மாதம் (1–12 அல்லது jan–dec)
# │ │ │ │ ┌─ வாரத்தின் நாள் (0–7 அல்லது sun–sat; 0 மற்றும் 7 — ஞாயிறு)
# │ │ │ │ │
* * * * * கட்டளை
ஒவ்வொரு புலத்திலும் சிறப்புக் குறியீடுகளைப் பயன்படுத்தலாம்:
| குறியீடு | பொருள் | எடுத்துக்காட்டு |
|---|---|---|
* | எந்த மதிப்பும் | * * * * * — ஒவ்வொரு நிமிடமும் |
, | பட்டியல் | 0 9,18 * * * — 9:00 மற்றும் 18:00-க்கு |
- | வரம்பு | 0 9-18 * * * — 9 முதல் 18 வரை ஒவ்வொரு மணி நேரமும் |
/ | இடைவெளி | */15 * * * * — ஒவ்வொரு 15 நிமிடத்துக்கும் |
இடைவெளியை வரம்புடன் சேர்க்கலாம்: 0 8-20/2 * * * — 8 முதல் 20 வரை ஒவ்வொரு இரண்டு மணி நேரமும் (8, 10, …, 20). நேரம் அமைப்பின் நேர மண்டலப்படி எடுக்கப்படுகிறது — அதை timedatectl மூலம் சரிபாருங்கள்.
ஒவ்வொரு நாளுக்குமான crontab எடுத்துக்காட்டுகள்
| அட்டவணை | crontab வரி |
|---|---|
| ஒவ்வொரு நிமிடமும் | * * * * * |
| ஒவ்வொரு 5 நிமிடத்துக்கும் | */5 * * * * |
| ஒவ்வொரு 30 நிமிடத்துக்கும் | */30 * * * * அல்லது 0,30 * * * * |
| ஒவ்வொரு மணி நேரத்தின் தொடக்கத்திலும் | 0 * * * * |
| ஒவ்வொரு 6 மணி நேரத்துக்கும் | 0 */6 * * * |
| ஒவ்வொரு நாளும் 3:00-க்கு | 0 3 * * * |
| ஒவ்வொரு நாளும் 23:45-க்கு | 45 23 * * * |
| வார நாட்களில் 9:00-க்கு | 0 9 * * 1-5 |
| வார இறுதிகளில் நண்பகலில் | 0 12 * * 6,0 |
| திங்கள்தோறும் 8:30-க்கு | 30 8 * * 1 |
| ஒவ்வொரு மாதம் 1-ஆம் தேதி 00:00-க்கு | 0 0 1 * * |
| காலாண்டுக்கு ஒருமுறை | 0 0 1 1,4,7,10 * |
| வருடத்துக்கு ஒருமுறை, ஜனவரி 1 | 0 0 1 1 * |
| வேலை நேரத்தில் ஒவ்வொரு 10 நிமிடத்துக்கும் | */10 9-18 * * 1-5 |
முழு பணி வரி — அட்டவணை மற்றும் கட்டளை:
# தினமும் இரவு 3:00-க்கு தரவுத்தள காப்புப் பிரதி
0 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1
# ஞாயிறுதோறும் 7 நாளுக்கு மேல் பழைய தற்காலிகக் கோப்புகளை அழிக்க
0 4 * * 0 /usr/bin/find /tmp/app -type f -mtime +7 -delete
# தளத்தை ஒவ்வொரு 5 நிமிடத்துக்கும் சரிபார்க்க
*/5 * * * * /usr/bin/curl -fsS https://example.com/health > /dev/null || /usr/local/bin/alert.sh
@reboot, @daily போன்ற சிறப்பு வரிகள்
ஐந்து புலங்களுக்குப் பதில் குறுகிய புனைபெயரை எழுதலாம்:
| புனைபெயர் | சமமானது |
|---|---|
@reboot | cron டீமன் தொடங்கும்போது ஒருமுறை (அமைப்பு துவங்கிய பின்) |
@hourly | 0 * * * * |
@daily / @midnight | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly / @annually | 0 0 1 1 * |
@reboot /home/alice/bin/start-tunnel.sh >> /home/alice/tunnel.log 2>&1
எப்போதும் இயங்க வேண்டிய, விழுந்தால் மீண்டும் தொடங்க வேண்டிய சேவைகளுக்கு @reboot பலவீனமான தீர்வு: Restart=on-failure கொண்ட systemd யூனிட் எழுதுவது நல்லது.
ஒவ்வொரு N வினாடிக்கும் பணியை இயக்குவது எப்படி
cron-இன் குறைந்தபட்ச அலகு ஒரு நிமிடம். அதை விட அடிக்கடி வேண்டுமென்றால் இரண்டு வழிகள் உள்ளன. முதலாவது — sleep மூலம் மாற்றப்பட்ட பல வரிகள்:
* * * * * /opt/check.sh
* * * * * sleep 30; /opt/check.sh
இரண்டாவது, இன்னும் சரியானது — OnUnitActiveSec=30s கொண்ட systemd டைமர். பணி ஒரு நிமிடத்துக்கு ஒருமுறைக்கு மேல் இயங்க வேண்டுமென்றால், அது பொதுவாக cron-க்கான வேலை அல்ல, டீமன் அல்லது டைமருக்கானது.
அமைப்பின் crontab: /etc/crontab மற்றும் /etc/cron.d
பயனர் அட்டவணைகளுடன் அமைப்பின் அட்டவணைகளும் உள்ளன. அவற்றின் வடிவம் வேறுபட்டது: நேரத்துக்கும் கட்டளைக்கும் இடையில் கட்டளையை இயக்க வேண்டிய பயனரின் பெயர் இருக்கும்.
# /etc/cron.d/certbot-renew
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root certbot renew --quiet
எது எங்கே இருக்கிறது:
/etc/crontab— முதன்மை அமைப்பு அட்டவணை; Debian/Ubuntu-வில் அதிலிருந்து கீழுள்ள அடைவுகள் இயக்கப்படுகின்றன./etc/cron.d/— தனித்தனி பணிக் கோப்புகள்; தொகுப்புகள் மூலமாகவோ Ansible மூலமாகவோ சேர்ப்பது வசதியானது./etc/cron.hourly/,cron.daily/,cron.weekly/,cron.monthly/— அட்டவணை இல்லாத இயக்கக்கூடிய ஸ்கிரிப்ட்கள் இங்கே வைக்கப்படுகின்றன; அவற்றைrun-parts(அல்லது anacron) இயக்குகிறது.
run-parts-இன் சிக்கல்: Debian மற்றும் Ubuntu-வில் பெயரில் புள்ளி உள்ள கோப்புகளை அது தவிர்க்கிறது. /etc/cron.daily/-இல் backup.sh இயங்காது — அதற்கு backup என்று பெயரிடுங்கள். எது இயக்கப்படும் என்று run-parts --test /etc/cron.daily மூலம் பார்க்கலாம்.
/etc/cron.d/-இல் உள்ள கோப்புகள் root-க்குச் சொந்தமாக இருக்க வேண்டும், குழுவும் மற்றவர்களும் எழுத முடியாதவையாக இருக்க வேண்டும், இறுதியில் வரி முறிவு இருக்க வேண்டும் — இல்லையென்றால் cron அவற்றைப் புறக்கணிக்கும்.
cron சூழல்: PATH, SHELL மற்றும் மாறிகள்
"முனையத்தில் வேலை செய்கிறது, cron-இல் இல்லை" என்பதற்கு முக்கிய காரணம் சூழல். Cron கட்டளைகளை /bin/sh மூலம், உங்கள் .bashrc மற்றும் .profile இல்லாமல், குறைந்தபட்ச PATH (பொதுவாக /usr/bin:/bin) உடன் இயக்குகிறது. எனவே /usr/local/bin-இல் உள்ள docker, node அல்லது php கண்டுபிடிக்கப்படாமல் போகலாம்.
மாறிகளை அட்டவணையின் தொடக்கத்தில் குறிப்பிடலாம்:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
CRON_TZ=Europe/Moscow
0 6 * * * cd /srv/app && ./report.sh
MAILTO— பணியின் வெளியீடு எங்கே அனுப்பப்பட வேண்டும்;MAILTO=""கடிதங்களை அணைக்கும்.CRON_TZ— அட்டவணைக்கான நேர மண்டலம் (RHEL/Fedora-வின் cronie ஆதரிக்கிறது; Debian பதிப்பின் cron-இல் இந்த மாறி வேலை செய்யாது).$HOME/binபோன்ற மாறி விரிவாக்கங்கள் மதிப்புகளில் இல்லை — பாதைகளை முழுமையாக எழுதுங்கள்.
மிகவும் நம்பகமான வழி — பணியில் எல்லா நிரல்களுக்கும் கோப்புகளுக்கும் முழுமையான பாதைகளைக் குறிப்பிடுவது; ஸ்கிரிப்ட்டின் முதல் வரியாக shebang #!/bin/bash வைப்பது.
cron பதிவுகளை எங்கே பார்ப்பது
Cron பணி தொடங்கிய உண்மையை பதிவேட்டில் எழுதுகிறது, ஆனால் அதன் வெளியீட்டை அல்ல:
# Debian/Ubuntu
grep CRON /var/log/syslog
# systemd-journald மூலம்
journalctl -u cron --since today # Debian/Ubuntu
journalctl -u crond --since today # RHEL, Fedora, Rocky
# journald இல்லாத RHEL
tail -f /var/log/cron
தொடக்கப் பதிவு இப்படித் தோன்றும்:
Oct 14 03:00:01 web1 CRON[21544]: (root) CMD (/usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1)
பணி எதை அச்சிட்டது, எந்தப் பிழையில் விழுந்தது என்று பார்க்க, stdout மற்றும் stderr இரண்டையும் ஒரு கோப்புக்கு திருப்புங்கள்: >> /var/log/job.log 2>&1. இதைச் செய்யாவிட்டால் வெளியீடு உள்ளூர் அஞ்சல் வழியாக கடிதமாகச் செல்லும், அஞ்சல் முகவர் நிறுவப்படாவிட்டால் அது தொலைந்துவிடும் (பதிவில் No MTA installed, discarding output தோன்றும்).
cron ஏன் பணியை இயக்கவில்லை: பொதுவான பிழைகள்
கட்டளை கிடைக்கவில்லை
அறிகுறி: பணியின் பதிவில் command not found. காரணம் — குறைக்கப்பட்ட PATH. தீர்வு: நிரலுக்கு முழு பாதை (which docker அதைக் காட்டும்) அல்லது அட்டவணையின் தொடக்கத்தில் PATH= வரி.
கட்டளையில் சதவீதக் குறி
crontab-இல் % குறி புதிய வரியைக் குறிக்கிறது: முதல் %-க்குப் பின் உள்ள அனைத்தும் கட்டளையின் நிலையான உள்ளீடாக அனுப்பப்படும். அதனால் கோப்புப் பெயரில் தேதி உள்ள பொதுவான வரி உடைகிறது:
# தவறு — முதல் %-இல் கட்டளை வெட்டப்படும்
0 2 * * * tar czf /backup/site-$(date +%F).tar.gz /var/www
# சரி — தப்பிக்கச் செய்யவும்
0 2 * * * tar czf /backup/site-$(date +\%F).tar.gz /var/www
இன்னும் எளிது — தர்க்கத்தை ஒரு ஸ்கிரிப்ட்டுக்கு நகர்த்துங்கள்; அங்கே %-ஐத் தப்பிக்க வேண்டியதில்லை.
ஸ்கிரிப்ட் இயக்கக்கூடியதல்ல அல்லது தவறான வரி முறிவுகள்
Permission denied பிழை என்றால் கோப்புக்கு x பிட் இல்லை: chmod +x script.sh இயக்குங்கள், அல்லது வெளிப்படையாக /bin/bash /opt/script.sh என்று இயக்குங்கள். ஸ்கிரிப்ட் Windows-இல் எழுதப்பட்டிருந்தால், CRLF வரி முறிவுகள் /bin/bash^M: bad interpreter என்ற விசித்திரமான பிழையைத் தரும் — sed -i 's/\r$//' script.sh அல்லது dos2unix மூலம் சரிசெய்யலாம்.
தொடர்புடைய பாதைகளும் வேலை அடைவும்
பணி பயனரின் வீட்டு அடைவிலிருந்து தொடங்குகிறது. ஸ்கிரிப்ட் ./config.ini-ஐப் படித்தால், அது ~-இல் தேடும். கட்டளைக்கு முன் cd /srv/app && சேருங்கள், அல்லது ஸ்கிரிப்ட்டுக்குள் முழுமையான பாதைகளைப் பயன்படுத்துங்கள்.
மாதத்தின் நாளும் வாரத்தின் நாளும் ஒரே நேரத்தில்
இரண்டு புலங்களும் குறிப்பிடப்பட்டால், cron இரண்டும் அல்ல, எதாவது ஒன்று பொருந்தும்போது இயங்குகிறது. 0 9 13 * 5 வரி 13-ஆம் தேதியிலும் ஒவ்வொரு வெள்ளியிலும் இயங்கும், வெள்ளி 13-ஆம் தேதியில் மட்டும் அல்ல. தேவையான நிபந்தனையை கட்டளைக்குள் சரிபாருங்கள்:
0 9 13 * * [ "$(date +\%u)" = 5 ] && /opt/friday13.sh
பணிகள் ஒன்றின் மேல் ஒன்று ஏறுகின்றன
காப்புப் பிரதி இடைவெளியை விட நீண்ட நேரம் எடுத்தால், அடுத்த இயக்கம் முந்தையதின் மேல் தொடங்கும். பாதுகாப்பு — flock மூலம் பூட்டு:
*/10 * * * * /usr/bin/flock -n /tmp/sync.lock /opt/sync.sh
-n கொடியுடன், முதல் நிகழ்வு இன்னும் இயங்கினால் இரண்டாவது உடனே முடிந்துவிடும்.
cron டீமன் இயங்கவில்லை
systemctl status cron மூலம் சரிபாருங்கள் (RHEL-இல் — crond). குறைந்தபட்ச படங்களில், எடுத்துக்காட்டாக Docker கொள்கலன்களில், cron டீமனே இருக்காது — crontab-இல் உள்ள பணிகளை இயக்க அங்கே யாரும் இல்லை.
cron பணியை எப்படித் திருத்துவது
cron-ஐ ஒத்த சூழலில் கட்டளையை இயக்குங்கள்:
env -i SHELL=/bin/sh PATH=/usr/bin:/bin HOME=$HOME /bin/sh -c '/opt/backup.sh'
இங்கே பிழை வந்தால் அது cron-இலும் வரும். தற்காலிகமாக * * * * * அட்டவணை அமைத்து, வெளியீட்டை ஒரு கோப்புக்கு திருப்பி tail -f மூலம் கண்காணியுங்கள். அட்டவணை வெளிப்பாடுகளைச் சரிபார்க்கும் இணைய கால்குலேட்டர்கள் உதவும், ஆனால் இறுதி சொல் அமைப்பின் பதிவுக்கே.
cron-ஐ யார் பயன்படுத்தலாம்: cron.allow மற்றும் cron.deny
அணுகலை /etc/cron.allow மற்றும் /etc/cron.deny கோப்புகள் கட்டுப்படுத்துகின்றன. cron.allow இருந்தால், அதில் பட்டியலிடப்பட்ட பயனர்கள் மட்டுமே crontab-ஐப் பயன்படுத்தலாம். அது இல்லாமல் cron.deny இருந்தால், பட்டியலில் உள்ளவர்களைத் தவிர எல்லோரும். தடுக்கப்பட்ட பயனர் crontab -e-இல் You (bob) are not allowed to use this program செய்தியைப் பெறுவார்.
சுருக்கம்
Crontab என்பது ஐந்து நேரப் புலங்களும் கட்டளையும் கொண்ட வரிகள்: */5 * * * * — ஒவ்வொரு 5 நிமிடத்துக்கும், 0 3 * * * — ஒவ்வொரு இரவும், 0 9 * * 1-5 — வார நாட்களில். அட்டவணையை crontab -e மூலம் திருத்துங்கள், முழுமையான பாதைகளைக் குறிப்பிடுங்கள், %-ஐத் தப்பிக்கச் செய்யுங்கள், வெளியீட்டை பதிவுக்கு எழுதுங்கள், நீண்ட பணிகளை flock மூலம் பாதுகாயுங்கள். இந்த crontab எடுத்துக்காட்டுகள் பெரும்பாலான சேவையகப் பணிகளுக்குப் போதும்; திட்டமிடல் மற்றும் தானியக்கம் Linux பாடநெறியில் நடைமுறையுடன் விளக்கப்பட்டுள்ளது.
அடிக்கடி கேட்கப்படும் கேள்விகள்
cron மற்றும் anacron இடையே என்ன வேறுபாடு?
Cron பணிகளை சரியான நேரத்தில் இயக்குகிறது, கணினி அணைக்கப்பட்டிருந்தால் அவற்றைத் தவிர்க்கிறது. Anacron தினசரி, வாராந்திர, மாதாந்திர பணிகள் கணினி இயக்கப்பட்ட பிறகு நிச்சயம் இயங்குவதை உறுதிசெய்கிறது, எனவே மடிக்கணினிகளுக்கும் டெஸ்க்டாப்புகளுக்கும் பொருந்தும்.
cron அல்லது systemd டைமர்களில் எது சிறந்தது?
Cron எளிமையானது, கிட்டத்தட்ட எல்லா இடங்களிலும் உள்ளது. systemd டைமர்கள் journalctl-இல் பதிவுகள், சார்புகள், வள வரம்பு, தவறிய இயக்கங்களுக்கு Persistent=true விருப்பத்தைத் தருகின்றன; அதனால் நவீன சேவையகங்களில் முக்கியமான பணிகளுக்கு அவை அதிகம் தேர்ந்தெடுக்கப்படுகின்றன.
பயனரின் crontab உண்மையில் எங்கே சேமிக்கப்படுகிறது?
Debian மற்றும் Ubuntu-வில் — /var/spool/cron/crontabs/பெயர்; RHEL மற்றும் Fedora-வில் — /var/spool/cron/பெயர். இந்தக் கோப்புகளை நேரடியாகத் திருத்த வேண்டாம், crontab -e பயன்படுத்துங்கள்.
crontab-இல் பணியை தற்காலிகமாக முடக்குவது எப்படி?
crontab -e மூலம் வரியின் தொடக்கத்தில் # குறியைச் சேர்த்து வரியைக் கருத்துரையாக்குங்கள். பயனரின் எல்லாப் பணிகளையும் முடக்க, crontab -l மூலம் அட்டவணையை ஒரு கோப்பில் சேமித்து, பின்னர் crontab -r மூலம் நீக்குங்கள்.
மாதத்தின் கடைசி நாளில் பணியை எப்படி இயக்குவது?
அதற்கென தனி புலம் இல்லை. பணியை 28–31 தேதிகளில் இயக்கி, நாளை 1-ஆம் தேதியா என்று சரிபாருங்கள்: 0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /opt/job.sh.
“Linux: с нуля до уверенного администрирования” பாடநெறியில் இந்தத் தலைப்பு பயிற்சியுடன் விரிவாக விளக்கப்பட்டுள்ளது.
பாடநெறிக்குச் செல்