Menjadwalkan tugas Linux dengan cron dan timer systemd
Cron cocok untuk jadwal sederhana, sedangkan timer systemd menggabungkan penjadwalan dengan status layanan dan log. Periksa penafsiran jadwal, eksekusi nyata, keluaran, serta kegagalan secara terpisah; terdaftarnya tugas belum membuktikan tugas berhasil dijalankan.
Uji perintah secara langsung, seperti pada dasar skrip Bash, sebelum menjadwalkannya. Periksa perilaku pengelola systemd pengguna setelah logout dan konfigurasi linger pada VM sebenarnya; pendaftaran timer saja tidak menjamin eksekusi berlanjut.
Rujukan latihan konfigurasi adalah mesin virtual (VM) dengan instalasi biasa Ubuntu 26.04 LTS, yaitu rilis dukungan jangka panjang, atau Rocky Linux seri 9. Kontainer, Windows Subsystem for Linux (WSL), dan rilis lain dapat berbeda dalam konfigurasi layanan serta paket. Siapkan pemulihan melalui konsol dan catat versi lingkungan melalui panduan persiapan mesin virtual berbahasa Inggris.
Memilih cron atau timer systemd
| Kriteria | cron | Timer systemd |
|---|---|---|
| Konfigurasi | Bidang waktu diikuti perintah | Unit timer dan service yang terpisah |
| Verifikasi | Keluaran tugas dan log sesuai distribusi | Status layanan dan journal |
| Lingkungan | Berbeda dari shell interaktif | Lingkungan yang ditentukan bagi unit |
| Jadwal yang terlewat | Cron tradisional umumnya tidak mengejar jadwal selama daemon tidak berjalan | Pertimbangkan OnCalendar dengan Persistent |
Nama daemon, yaitu proses layanan latar belakang, dan paketnya berbeda antar-distribusi: Ubuntu umumnya memakai cron, sedangkan Rocky Linux memakai cronie dan crond. Contoh timer memerlukan pengelola systemd pengguna yang tersedia. Bedakan cron tradisional dari alat pelengkap seperti anacron; penanganan perubahan jam juga bergantung pada implementasi.
Membaca bidang cron dan konteks eksekusinya
crontab -e menyunting jadwal pengguna saat ini. Lima bidang waktu crontab pengguna adalah menit, jam, tanggal dalam bulan, bulan, dan hari dalam minggu, lalu perintah. Contoh berikut menjadwalkan setiap hari pukul 02.15; ganti /home/USER dengan jalur absolut sebenarnya. Entri sistem /etc/crontab juga memuat bidang nama pengguna sebelum perintah.
15 2 * * * /bin/bash /home/USER/bin/job.sh >> /home/USER/job.log 2>&1
Cron tidak mewarisi PATH, direktori kerja, dan variabel terminal interaktif Anda persis seperti semula. Gunakan jalur absolut, tentukan direktori kerja secara eksplisit di skrip, dan jangan menaruh rahasia langsung dalam teks crontab. Jika tanggal dan hari dalam minggu sama-sama dibatasi, pencocokan dapat memakai logika OR: cocok salah satu, bukan harus keduanya.
Periksa zona waktu, aturan daylight saving time atau perubahan jam musiman, dan perlakuan tanda persen pada implementasi yang digunakan. Dalam Cronie, % yang tidak diloloskan dengan garis miring terbalik pada bagian perintah diubah menjadi baris baru, dan bagian setelah persen pertama menjadi masukan standar. Aturan itu berbeda dari menjalankan perintah yang sama langsung di terminal.
Membuat unit service dan timer pengguna lengkap
Jangan menimpa unit yang sudah ada dengan nama ini. Contoh menulis waktu ke journal pengguna setiap menit tanpa layanan root. Pastikan jalur /usr/bin/date melalui command -v date dan sesuaikan ExecStart jika berbeda. Periksa systemctl --version serta ketersediaan systemctl --user di VM.
Blok memakai subshell ( ... ) agar pengaturan set -C, yang menolak penimpaan berkas biasa oleh pengalihan keluaran, tidak menetap di shell Anda. Pemeriksaan awal menolak nama unit yang sudah ada, termasuk tautan simbolis. Kegagalan penulisan atau pemeriksaan kalender menghentikan pendaftaran berikutnya. Jika tahap awal gagal, periksa berkas latihan yang mungkin sudah terbentuk sebelum mencoba lagi; jangan menghapus unit yang asalnya belum jelas.
(
set -C
for unit in "$HOME/.config/systemd/user/linux-course-clock.service" "$HOME/.config/systemd/user/linux-course-clock.timer"; do
if [[ -e "$unit" || -L "$unit" ]]; then
printf 'Unit already exists: %s\n' "$unit" >&2
exit 1
fi
done
mkdir -p "$HOME/.config/systemd/user" || exit 1
cat > "$HOME/.config/systemd/user/linux-course-clock.service" <<'EOF' || exit 1
[Unit]
Description=Linux course timestamp exercise
[Service]
Type=oneshot
ExecStart=/usr/bin/date --iso-8601=seconds
EOF
cat > "$HOME/.config/systemd/user/linux-course-clock.timer" <<'EOF' || exit 1
[Unit]
Description=Run the course clock every minute
[Timer]
OnCalendar=*-*-* *:*:00
AccuracySec=1s
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemd-analyze calendar '*-*-* *:*:00' || exit 1
systemctl --user daemon-reload || exit 1
systemctl --user enable --now linux-course-clock.timer
)
Timer mengaktifkan service dengan nama dasar yang sama. OnCalendar menentukan jadwal kalender; *-*-* *:*:00 berarti setiap menit pada detik 00 menurut zona waktu yang berlaku. AccuracySec mengatur toleransi pengelompokan waktu pemicu, bukan jaminan eksekusi waktu nyata.
Dengan Persistent=true, aktivasi kembali dapat memicu tugas yang seharusnya berjalan ketika timer tidak aktif. Kejadian yang terlewat tidak diputar ulang satu per satu. Pengaturan ini berlaku pada timer OnCalendar dan menyimpan status waktu di disk.
Memeriksa pemicu berikutnya dan hasil nyata
systemctl --user list-timers --all linux-course-clock.timer
systemctl --user status linux-course-clock.timer
journalctl --user -u linux-course-clock.service --since "5 minutes ago" --no-pager
systemctl --user show linux-course-clock.service -p Result -p ExecMainStatus
timedatectl
Periksa pemicu berikutnya, lalu setelah satu atau dua menit lihat keluaran waktu pada journal, yaitu catatan log systemd. Layanan oneshot dapat berstatus inactive setelah berhasil, jadi baca Result dan ExecMainStatus juga. timedatectl membantu membandingkan zona waktu server dan sinkronisasi jam dengan jadwal operasional yang dimaksud.
Jika tugas harus berlanjut setelah logout, periksa siklus hidup pengelola pengguna dan kebijakan linger systemd di lingkungan tersebut. Linger mempertahankan pengelola pengguna setelah logout bila diaktifkan, tetapi perubahan kebijakan itu perlu keputusan tersendiri. Mengaktifkan timer tidak membuktikan perilakunya dalam semua keadaan logout atau reboot. Timer sistem produksi memerlukan akun layanan, jalur, hak akses, dan batas sumber daya yang dirancang secara sengaja.
Mengendalikan tumpang tindih dan menghapus latihan
Tugas cron yang berlangsung lebih lama daripada intervalnya dapat tumpang tindih dengan eksekusi berikutnya; pertimbangkan penguncian seperti flock jika sesuai. Timer tidak otomatis membuat instans kedua dari service yang sama selama unit itu masih aktif. Unit lain atau pemanggilan manual tetap dapat memakai sumber daya yang sama, sehingga kebutuhan konkurensi aplikasi tetap harus ditangani.
Hentikan timer sebelum menghapusnya. disable --now pada timer mencegah pemicu berikutnya, tetapi tidak otomatis menghentikan service yang sudah berjalan. Periksa service latihan dan tunggu perintah date selesai; jika masih aktif, hentikan hanya service latihan yang telah Anda pastikan identitasnya. Pembersihan status Persistent dilakukan sebelum dua berkas unit latihan dihapus.
systemctl --user disable --now linux-course-clock.timer &&
systemctl --user clean --what=state linux-course-clock.timer &&
rm -- "$HOME/.config/systemd/user/linux-course-clock.timer" "$HOME/.config/systemd/user/linux-course-clock.service" &&
systemctl --user daemon-reload &&
systemctl --user list-timers --all linux-course-clock.timer
systemctl clean --what=state menghapus status waktu milik timer itu, sesuai dokumentasi pembersihan Persistent. Rangkaian && menghentikan langkah berikutnya jika tahap sebelumnya gagal. Jika versi terpasang menolak perintah, periksa manual lokal dan pesannya; jangan mencari lalu menghapus berkas status lain secara sembarang.
Penghapusan berkas hanya menargetkan dua unit latihan. Jika menambahkan contoh cron, hapus hanya entri tersebut melalui crontab -e dan verifikasi dengan crontab -l; jangan hapus seluruh jadwal. Otomatisasi produksi juga memerlukan pemeriksaan independen untuk mendeteksi kegagalan atau tugas yang tidak berjalan dan prosedur pemulihannya.




