- Cron ialah syaitan bagi pengaturcaraan tugasan dalam Linux dan dikonfigurasikan menggunakan fail crontab sistem dan pengguna.
- Sintaks crontab membolehkan anda menentukan masa pelaksanaan dengan medan masa dan aksara khas seperti *, -, dan /.
- Mengawal PATH dan kebenaran adalah kunci. balak dan jadual supaya kerja cron berfungsi dengan baik tanpa menjejaskan prestasi.
- Terdapat alternatif dan tambahan seperti Anacron, pemasa sistem, penjadual pelancaran atau grafik bergantung pada sistem dan kerumitan.
Jika anda bekerja dengan Linux, lambat laun anda akan memerlukannya mengautomasikan tugasan berulangSandaran, pembersihan, kemas kini, penjanaan laporan, permulaan semula perkhidmatan… Untuk semua itu, sekutu klasik ialah daemon cron dan fail crontabyang membolehkan anda memberitahu sistem apa yang perlu dijalankan dan bila perlu melakukannya, tanpa perlu memerhatikannya.
Walaupun konsepnya mudah, realitinya ialah cron mempunyai banyak kedalaman: jenis crontab, sintaks yang penuh dengan simbolkebenaran, log, impak prestasi, ralat biasa, alternatif seperti pemasa sistem, Perbezaan antara cron dan anakron atau penyelesaian khusus untuk Windows dan macOS. Dalam panduan ini, anda akan menemui penjelasan yang komprehensif dan teratur tentang semua yang kelihatan berselerak di seluruh dokumentasi dan pada halaman yang berbeza, tetapi dijelaskan dalam perkataan yang berbeza dan dalam nada yang lebih mudah difahami.
Apakah kronograf dan mengapakah penting untuk memastikan masa yang tepat?
Dalam jenis sistem Unix, cron ialah daemon berjalan di latar belakang dari saat mesin bermula. Tugasnya sangat mudah dari segi penampilan: setiap minit ia menyemak jadual pengaturcaraannya dan melihat sama ada sebarang arahan sepadan dengan tarikh dan masa semasa; jika ia sepadan, ia melaksanakan arahan atau skrip ditunjukkan
Ini menunjukkan bahawa Cron mempercayai sepenuhnya masa sistemJika jam atau zon waktu dikonfigurasikan dengan salah, tugasan akan dicetuskan pada masa selain daripada yang anda jangkakan. Untuk mengelakkan perkara ini, adalah penting untuk menggunakan penyegerakan dengan [perkhidmatan/platform yang berkaitan]. NTP (Protokol Masa Rangkaian), yang menyimpan masa yang betul dengan merujuk pelayan masa di Internet.
Dalam kebanyakan taburan moden, anda boleh menyemak status masa dengan:
timedatectl
Arahan ini menunjukkan jika tarikhnya betul, apakah zon waktu Ia aktif dan sistem disegerakkan dengan NTP. Jika anda melihat bahawa zon waktu tidak betul, anda boleh melaraskannya dengan sesuatu seperti:
timedatectl set-timezone Europe/Madrid
Tambahan pula, perkhidmatan NTP dikonfigurasikan dalam fail seperti /etc/ntp.conf atau setara bergantung pada taburan. Menyiapkan semua ini adalah penting, kerana jika jam tidak segerak, anda kerja cron Mereka akan mula berlari pada waktu yang tidak masuk akal tanpa anda nampaknya mengubah apa-apa.
Apakah sebenarnya crontab?
Daemon cron tidak "tahu" apa yang perlu dilakukan sendiri; ia dipandu oleh satu atau lebih fail khas yang dipanggil crontab (jadual cron)Setiap fail ini merupakan fail teks ringkas dengan baris yang menunjukkan bila dan apa yang perlu dilaksanakan, menggunakan sintaks padat berdasarkan medan masa.
Dalam sistem Linux standard terdapat dua jenis konfigurasi utama:
- crontab sistem: biasanya dalam / etc / crontab dan dilengkapi dengan fail dalam /etc/cron.d/ atau dengan direktori seperti /etc/cron.setiap jam, /etc/cron.dailydll. Dia biasanya mengendalikannya. akar dan digunakan untuk tugas sistem yang kritikal.
- Crontab penggunaSetiap pengguna boleh mempunyai jadual mereka sendiri, yang disimpan dalam laluan seperti / var / spool / cron o /var/spool/cron/crontabs mengikut taburan. Ini adalah cara yang disyorkan untuk setiap orang menjadualkan kerja mereka sendiri tanpa menyentuh tetapan global.
Crontab pengguna tidak disunting secara langsung dengan editor biasa, tetapi melalui arahan crontab, yang bertanggungjawab untuk menyimpan fail di lokasi yang betul dengan kebenaran yang sesuai.
Untuk melihat, mencipta atau mengubah suai jadual pengguna semasa, gunakan:
crontab -e
Jika anda mempunyai keistimewaan pentadbir, anda boleh mengurus jadual pengguna lain dengan menambah pilihan -u:
crontab -e -u nombreusuario
Sintaks asas baris crontab
Setiap kerja yang dijadualkan menempati satu baris dalam fail crontab. Format asas, dalam crontab pengguna, ialah:
m h dom mon dow comando
Lima medan awal ini menentukan momen atau berkala, dan selepasnya arahan atau skrip lengkap untuk melaksanakan. Medan bermaksud:
- Minit (m): nilai dari 0 hingga 59.
- Masa (j): dari 0 hingga 23 (format 24 jam).
- Hari dalam sebulan (Ahad): dari 1 hingga 31.
- Bulan (isnin): dari 1 hingga 12 atau nama/singkatan bulan mengikut sistem.
- Hari dalam seminggu (bawah): dari 0 hingga 6 (kadangkala 0 dan 7 mewakili Ahad) atau singkatan Bahasa Inggeris (isn, tue, dsb.).
Dalam crontab sistem (contohnya dalam / etc / crontabTerdapat medan tambahan sebelum arahan yang menunjukkan pengguna yang akan menjalankannya tugasan itu:
m h dom mon dow usuario comando
Input sistem biasa mungkin:
00 19 * * 0 usuario /ruta/absoluta/consulta.sh
Baris itu akan melaksanakan skrip. setiap Ahad Pada pukul 19:00 PM, menggunakan akaun pengguna tertentu itu. Walau bagaimanapun, dalam crontab peribadi, pengguna tersirat sentiasa pemilik fail, jadi medan itu tidak muncul.
Aksara khas dalam cron: *, -, /, dan lain-lain
Kuasa hebat cron datang daripada fakta bahawa anda tidak perlu menulis satu nombor pun dalam setiap lajur. Anda boleh menggunakan simbol khas untuk menentukan julat, senarai atau selang masa, yang membolehkan anda membuat peraturan yang agak canggih tanpa memerlukan skrip yang kompleks.
- * (asterisk): bermaksud "semua nilai yang mungkin" dalam medan tersebut. Contohnya, * dalam medan bulan menunjukkan semua bulan.
- , (koma): digunakan untuk menunjukkan senarai nilai tertentu. Contohnya, dalam medan jam, 6,18 Ia akan beroperasi pada pukul 6:00 petang dan 18:00 petang.
- - (sempang): mentakrifkan julat. Jika pada hari dalam seminggu anda meletakkan 1-5Anda akan menentukan dari Isnin hingga Jumaat.
- / (bar): menyatakan "setiap n". Contohnya, */10 Dalam bidang ini, perkataan "minit" bersamaan dengan "setiap sepuluh minit".
- julat/kecualiSesetengah pelaksanaan membenarkan sintaks seperti 0-23/2 untuk mengatakan "setiap 2 jam" dalam julat penuh 0 hingga 23.
Tambahan pula, setiap perkara yang bermula dengan # Permulaan baris dianggap sebagai komen dan tidak berjalanIni sangat praktikal untuk mendokumentasikan apa yang dilakukan oleh setiap kerja dan untuk melumpuhkan entri buat sementara waktu tanpa memadamkannya.
Rentetan yang telah ditetapkan: @daily, @reboot dan rakan-rakan
Bagi kebanyakan kes biasa, cron menyokong pelbagai kata kunci Ini menggantikan medan lima masa dan memudahkan jadual dengan ketara. Ia menawarkan kurang fleksibiliti berbanding sintaks penuh, tetapi sangat mudah untuk tugas mudah.
Yang paling biasa digunakan ialah:
- @but semula: melaksanakan tugas sekali setiap kali sistem bermula.
- @semangat o @tahunan: sekali setahun (bersamaan dengan 0 0 1 1 *).
- @bulanan: hari pertama setiap bulan pada tengah malam (0 0 1 * *).
- @mingguan: sekali seminggu, pada minit pertama jam pertama hari tersebut dianggap sebagai permulaan minggu (0 0 * * 0 dalam kebanyakan sistem).
- @harian o @midnight: setiap hari pada pukul 00:00 (0 0 * * *).
- @setiap jam: setiap jam, pada minit 0 (0 * * * *).
Apabila anda mengedit dengan crontab -eAnda boleh menggunakan rentetan ini secara langsung, jadi tugas harian seperti menjalankan skrip sekali sehari dikurangkan kepada baris yang sangat bersih dengan @harian dan arahan yang dikehendaki.
Contoh praktikal pengaturcaraan dengan cron
Teorinya memang bagus, tetapi apa yang benar-benar mengukuhkan konsep ini adalah contohnya. Dengan sintaks yang telah kita lihat, anda boleh memprogram perkara seperti:
- Skrip setiap hari pada pukul 19:00 malam:
00 19 * * * /ruta/del/script/consulta.sh - Hanya pada hari Ahad jam 19:00 malam:
00 19 * * 0 /ruta/del/script/consulta.sh - 4 Februari jam 19:00 malam setiap tahun:
00 19 4 2 * /ruta/del/script/consulta.sh - Setiap 10 minit:
*/10 * * * * /ruta/del/script.sh - Isnin hingga Jumaat pada jam 7:55 dan 19:55:
55 7,19 * * 1-5 /ruta/del/script.sh
Banyak tutorial mengesyorkan agar tidak menggunakan secara berlebihan arahan kerumitan dalam baris cron itu sendiri dan, sebaliknya, mewujudkan skrip khusus (contohnya, dalam /usr/local/bin atau direktori skrip) dan jalankan hanya skrip tersebut daripada crontab. Ini memastikan jadual bersih dan logik dalam fail yang lebih mudah untuk dinyahpepijat.
Mencipta skrip dan kebenaran untuk menggunakannya dengan cron
Agar cron dapat menjalankan skrip anda, tidak cukup hanya dengan menjadualkannya; ia mesti ada kebenaran pelaksanaan yang betul dan laluan yang sesuai. Contoh mudah skrip ialah:
nano consulta.sh
#!/bin/bash
# script de ejemplo
sudo ls -l / > archivoResultado.txt
Setelah disimpan, ia mesti boleh dieksekusi supaya cron tidak gagal:
chmod ugo+x consulta.sh
Perkara ini penting, kerana jika fail tidak boleh dilaksanakan, kerja akan gagal secara senyap atau menghasilkan ralat yang akan anda lihat kemudian. log atau e-melDari sana, anda boleh menambah baris yang sepadan pada crontab anda dengan laluan mutlak ke skrip.
Pembolehubah persekitaran dan PATH dalam crontab
Apabila cron menjalankan tugas, ia tidak melakukannya dalam persekitaran yang sama seperti anda. terminal Interaktif. Ia bermula dengan persekitaran yang sangat minimum, dengan pembolehubah seperti RUMAH, SHELL, LOGNAME dan PATH ditetapkan kepada nilai asas. Ini menyebabkan salah satu ralat yang paling biasa: skrip yang berfungsi dengan sempurna dalam konsol tetapi Mereka gagal apabila melalui cron.
Sebab yang biasa adalah bahawa PATH yang dilihat oleh cron tidak termasuk direktori di mana arahan seperti git, ular sawa, pip, nod dan yang serupa. Penyelesaiannya adalah sama ada dengan sentiasa menggunakan laluan mutlak kepada binari dalam skrip anda, atau tentukan PATH eksplisit pada permulaan fail crontab, contohnya:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO="[email protected]"
Ini memastikan bahawa cron cari fail boleh laku seolah-olah anda memanggilnya daripada shell interaktif. Dan dengan menambah pembolehubah MAILTO, anda boleh mengawal alamat yang mana output dan ralat kerja dihantar.Hantar e-mel daripada bash dan powershell).
Di mana untuk melihat output dan log kerja cron
Secara lalai, cron menghantar output piawai dan output ralat Setiap kerja dihantar ke alamat e-mel tempatan pengguna yang menjadualkan tugasan tersebut. Jika anda mempunyai MTA yang dikonfigurasikan (contohnya, Postfix atau Sendmail), anda boleh membaca mesej ini dengan alat seperti mel atau mengalihkan mereka ke akaun luaran.
Dalam persekitaran minimum di mana e-mel tidak dikonfigurasikan, aktiviti cron biasanya direkodkan dalam fail log sistem. Bergantung pada pengedaran, anda akan menemui maklumat dalam:
- / var / log / syslog (Ubuntu, Debian dan derivatif).
- /var/log/cron (CentOS, RHEL, Oracle Linux, dll.).
Untuk menyiasat masalah, anda boleh menggunakan arahan seperti:
tail -n 50 /var/log/syslog | grep CRON
tail -f /var/log/cron
Tambahan pula, anda sentiasa boleh mengalihkan output kerja ke fail tertentu, contohnya untuk mempunyai log khusus kepada pekerjaan itu:
0 2 * * * /home/usuario/backup.sh >> /var/log/backup.log 2>&1
Jika apa yang anda mahukan adalah untuk tidak dihantar tiada apa-apa melalui posAnda boleh menghantar semua output ke /dev/null:
0 2 * * * /ruta/script.sh >/dev/null 2>&1
Pentadbiran crontab asas
Perintah itu crontab Ia memusatkan operasi yang paling biasa untuk mengurus kerja berjadual pengguna. Pilihan yang paling kerap digunakan ialah:
- crontab -e: mengedit (atau mencipta) crontab pengguna semasa dengan editor lalai (nano, vim, dll.).
- crontab -l: menyenaraikan semua entri semasa dalam jadual pengguna.
- crontab -r: memadam sepenuhnya crontab pengguna (tanpa pengesahan, teruskan dengan berhati-hati).
- fail crontab: menggantikan crontab semasa dengan kandungan fail yang ditentukan.
- pengguna crontab -u: mengurus jadual pengguna lain (memerlukan kebenaran).
- crontab -c dirDalam sesetengah sistem, ia membolehkan anda menentukan direktori tempat fail crontab disimpan.
Sekiranya anda ingin membuat a sandaran Untuk kerja anda, hanya eksport jadual ke fail teks:
crontab -l > ~/crontab_backup.txt
Dan pulihkannya kemudian dengan:
crontab ~/crontab_backup.txt
Kesan terhadap prestasi dan amalan terbaik
Cron sendiri menggunakan sumber yang sangat sedikit, tetapi itu tidak bermakna anda boleh mengisi sistem dengan peraturan tanpa berfikir panjang. Setiap kerja yang dicetuskan melibatkan CPU, memori, cakera dan selalunya penggunaan rangkaianJika banyak kerja berat serentak el tiempoAnda boleh menyebabkan lonjakan yang menjejaskan pengguna atau perkhidmatan dalam pengeluaran.
Apabila menjadualkan banyak tugasan, terdapat beberapa risiko yang jelas:
- Penggunaan sumberJika beberapa skrip intensif bermula serentak (contohnya, sandaran dan kemas kini), anda boleh membebankan CPU atau I/O dan menyebabkan sistem menjadi lembap.
- Beban rangkaianTugasan yang menyegerakkan data, memuat naik fail atau API pertanyaan boleh menggunakan lebar jalur pada masa kritikal.
- Konflik aksesDua kerja menulis ke fail atau pangkalan data yang sama pada masa yang sama boleh menghasilkan keputusan yang rosak atau tidak konsisten.
Untuk mengurangkan masalah ini, disyorkan untuk:
- Pilih waktu luar puncak, seperti awal pagi, untuk tugas-tugas berat.
- Gunakan alatan seperti baik y cpulimit untuk mengurangkan keutamaan atau mengehadkan penggunaan CPU bagi proses tertentu.
- Elakkan pelaksanaan skrip yang sama secara serentak menggunakan kawanan atau teknik menyekat yang lain.
- Pantau log sistem dan tindak balas secara berkala untuk mengesan kesesakan menggunakan pantau prestasi dengan eBPF.
Satu helah berguna ialah menambah sesuatu seperti ini pada cron:
0 3 * * * nice -n 19 /ruta/script_pesado.sh
Dengan cara itu, anda boleh melakukan kerja pada tengah malam dan dengan keutamaan CPU terendahmengurangkan kesannya terhadap proses-proses lain.
Kesilapan biasa dan cara mengelakkannya
Bekerja dengan cron mempunyai kelemahannya. Terdapat beberapa ralat biasa yang perlu anda ketahui untuk mengelakkan perkara yang tidak diingini:
- PATH tidak lengkapSeperti yang telah disebutkan, arahan yang berfungsi secara manual berhenti berfungsi dalam cron kerana ia tidak berada dalam PATH daemon.
- Keizinan yang salah: skrip tanpa bit pelaksanaan atau dengan kebenaran yang terlalu ketat untuk pengguna yang menjalankannya.
- Laluan relatifMenggunakan ./script.sh atau laluan relatif tanpa menukar ke direktori yang betul dalam skrip menyebabkan ralat "fail tidak dijumpai".
- Output yang tidak terkawal: tidak mengalihkan log atau mentakrifkan MAILTO dan kemudian menyebabkan giliran mel pecah atau tanpa kesan apa yang berlaku.
- selalu sangat: kerja yang berjalan setiap minit tanpa perlu, menjana beban berterusan dan log yang besar.
Untuk penyahpepijatan, amalan yang sangat disyorkan ialah Uji skrip secara manual terlebih dahulu Gunakan akaun pengguna yang sama yang akan menjalankan cron, dan hanya jadualkannya apabila semuanya berjalan lancar. Dan, sudah tentu, tambahkan komen yang jelas pada crontab untuk mengingatkan diri anda tentang apa yang dilakukan oleh setiap baris.
Kawalan keselamatan dan akses kepada cron
Tugasan automatik merupakan sasaran utama penyalahgunaan jika seseorang berjaya menulis atau mengubah suai crontab anda. Itulah sebabnya banyak pengedaran membolehkan anda mengurus siapa yang boleh menggunakan cron melalui fail konfigurasi. /etc/cron.allow y /etc/cron.deny.
Operasi tipikal ialah:
- Sekiranya wujud /etc/cron.allowHanya pengguna yang disenaraikan di sana sahaja yang boleh menggunakan cron.
- Jika kebenaran tidak wujud tetapi ada /etc/cron.deny, semua orang kecuali mereka yang disenaraikan akan dapat menggunakannya.
Di samping itu, adalah dinasihatkan semak kebenaran Berkenaan skrip dan direktori yang terlibat, elakkan menambah arahan atau laluan sudo yang tidak dikawal dengan baik yang boleh diubah suai oleh sesiapa sahaja pada cron. Crontab yang terdedah boleh menjadi jalan pintas untuk meningkatkan keistimewaan atau mengekalkan kegigihan pada sistem yang terjejas.
Alternatif kepada cron dan crontab pada Linux, Windows dan macOS
Walaupun cron kekal sebagai standard de facto pada banyak pelayan, ia bukanlah satu-satunya pilihan, dan juga bukan yang paling sesuai. Terdapat alat untuk mengendalikan kes yang biasanya tidak diuruskan oleh cron, seperti kerja yang perlu dijalankan walaupun komputer telah dimatikan.
Dalam dunia Linux/Unix, perkara berikut menonjol:
- AnakronSesuai untuk komputer yang tidak dihidupkan 24/7. Jika tugasan yang dijadualkan tidak dapat dilaksanakan kerana mesin dimatikan, ia akan dilancarkan apabila komputer dimulakan semula.
- Fcron: serupa dengan cron tetapi lebih fleksibel dengan jadual, membolehkan anda menentukan perkara seperti "sekitar masa ini" dan juga bekerja pada mesin yang kerap dimatikan.
- hcronKurang dikenali, ia menambah ciri-ciri seperti label untuk mengatur kerja, pengurusan rangkaian pasukan dan penambahbaikan keselamatan dalam pengurusannya.
- McCon: satu lagi pelaksanaan dengan kekhususan, seperti kemungkinan mentakrifkan semula jadual dan membina semula pekerjaan dari titik awal.
Terdapat juga alternatif yang hebat untuk sistem bukan Linux:
- WindowsTerdapat alat seperti WinCron, VisualCron atau Advanced Task Scheduler yang menawarkan antara muka grafik sangat lengkap untuk penjadualan tugasan tanpa perlu berurusan dengan sintaks cron.
- MacOSWalaupun cron masih wujud, Apple mengesyorkan penggunaan pelancaranIa dikonfigurasikan menggunakan fail .plist dan menawarkan integrasi yang lebih mendalam dengan sistem: permulaan semula automatik tugas yang gagal, keadaan lanjutan, dsb.
Dalam Linux moden, kita juga tidak boleh melupakan pemasa systemdyang bertindak sebagai "cron bersepadu" dalam systemd. Ia membenarkan perkara yang cron tidak lakukan dengan baik: merantai perkhidmatan, bertindak balas terhadap peristiwa (boot(sambungan rangkaian…), uruskan percubaan semula, log ke jurnal, dsb. Ia lebih kompleks untuk dikonfigurasikan, tetapi untuk persekitaran yang mencabar, ia selalunya merupakan pilihan terbaik.
Cron dalam persekitaran profesional dan perniagaan
Dalam konteks pelayan dan perniagaan, cron dan crontab merupakan asas untuk mengautomasikan tugas rutin dan mengurangkan ralat manusia. Antara kegunaan biasa dalam organisasi ialah:
- Sandaran harian atau mingguan pangkalan data dan fail-fail kritikal.
- Kemas kini sistem dan aplikasi secara berkala, atau pemeriksaan keselamatan.
- Penjanaan dan penghantaran laporan secara automatik ke jabatan yang berbeza.
- Skrip penyelenggaraan: membersihkan log lama, memutar fail, mengosongkan fail sementara.
- Pemantauan berjadual sumber (CPU, RAM, cakera) dan perkhidmatan.
Manfaat utamanya ialah membebaskan pentadbir dan juruteknik daripada tugasan berulang supaya mereka boleh menumpukan perhatian pada kerja bernilai lebih tinggi. Walau bagaimanapun, dalam persekitaran profesional, perhatian khusus mesti diambil terhadap dokumentasi kerjaKawalan versi skrip dan semakan berkala terhadap apa yang diprogramkan, untuk mengelakkan kejutan apabila pasukan atau orang berubah.
Selain itu, amalan yang baik adalah menggunakan cron untuk memberi suapan kepada sistem pemantauan dan amaran (contohnya, dengan skrip semak memaklumkan perkhidmatan seperti Healthchecks.io apabila sesuatu gagal atau tidak berjalan tepat pada masanya), jadi anda tidak hanya bergantung pada melihat log secara manual.
Dengan semua ini, cron dan crontab menjadi sejenis "jadual automatik" untuk sistem: jika anda merancang frekuensi dengan baik, memantau kebenaran, mengawal persekitaran dan menjaga log, anda boleh bergantung padanya untuk hampir semua jenis automasi harian tanpa menjadi gila atau menghukum prestasi pelayan anda.
Penulis yang bersemangat tentang dunia bait dan teknologi secara umum. Saya suka berkongsi pengetahuan saya melalui penulisan, dan itulah yang akan saya lakukan dalam blog ini, menunjukkan kepada anda semua perkara yang paling menarik tentang alat, perisian, perkakasan, trend teknologi dan banyak lagi. Matlamat saya adalah untuk membantu anda mengemudi dunia digital dengan cara yang mudah dan menghiburkan.