Task Scheduling
Task scheduling adalah sebuah fitur pada sistem linux yang dapat digunakan user membuat sebuah agenda atau mengotomasikan tugas-tugas dalam waktu atau jeda tertentu tanpa harus menjalankan secara manual. Fitur tersebut dapat digunakan pada distro seperti ubuntu, redhat dan solaris. Pada umumnya fitur tersebut digunakan untuk mengupdate software secara otomatis, menjalankan script tertentu, membersihkan database dan otomasi backup. Fitur ini juga dapat digunakan user untuk membuat skedul umum dan tugas berulang. Selain itu, alert juga dapat pasang dan ditampilkan ketika beberapa kejadian terjadi atau untuk mengkontak administrator atau user.
Systemd
Systemd adalah sebuah service yang digunakan didalam sistem linux seperti ubuntu, redhat dan solaris untuk memulai proses atau script pada waktu yang ditentukan. Dengat systemd, kita dapat memasang proses atau script untuk berjalan pada waktu yang dispesifikasikan atau dalam interval waktur tertentu dan juga dapat menspesifikasikan kerjadian tertentu dan metrigger (memicu) task agar berjalan. untuk membuat itu ada beberapa langkah yang harus dilakukan sebelum script atau proses secara otomatis dijalankan oleh system.
- Membuat timer
- Membuat service
- Mengaktifkan timer
Info
systemctl
adalah command yang akan sering dipakai untuk melihat service.
Create a Timer and Service
Untuk membuat sebuah service yang berjalan dalam waktu interval atau waktu tertentu kita harus membuat file script sh, service dan timer. Konsepnya, timer akan dijalankan berdasarkan waktu atau interval yang ditetapkan pada konfigurasi didalam file tersebut lalu mentriger file service tersebut agar berjalan. Direktori yang digunakan untuk mengempatkan service dan timer /etc/systemd/system/
.
Mari sekarang membuat sebuah service
[Unit]
Description=Ini Timer Gua Untuk Latihan (Service)
[Service]
User=maruffarras
ExecStart=/home/maruffarras/learn/learn-ubuntu/update_date.sh
Keyname user
menentukan username sedangkan ExecStart
adalah eksekusi ketika service ini dijalankan. Selanjutnya kita buat sebuah timer yang nantinya digunakan untuk mentriger service diatas.
[Unit]
Description=Ini Timer Gua Untuk latihan
[Timer]
OnBootSec=1min
OnUnitActiveSec=2
AccuracySec=1us
Unit=timergua.service
[Install]
WantedBy=multi-user.target
OnBootSec
adalah waktu dimana timer ajak dijalankan saat sistem dinyalakan. OnUnitActiveSec
adalah interval waktu timer dijalankan. AccuracySec
adalah settingan untuk menambah presisi interval dalam satuan detik. Dan Unit
adalah targer service yang nantikanya ditriger oleh timer.
Pada Sesi Install, WantedBy
It defines the services that should be started on a normal system startup.
Reload Systemd
Setiap perubahan file service, timer atau yang lainnya pada alamat /etc/systemd/system
harus menload ulang daemon seperti dibawah ini
Setelah diload pastika service (service dan timer pada kasus ini) telah terbentuk menggunakan kode syntax systemctl status <servie name> <another servie>
1
maruffarras@BrownTofu:/etc/systemd/system$ sudo systemctl status timergua.*
○ timergua.service - Ini Timer Gua Untuk Latihan (Service)
Loaded: loaded (/etc/systemd/system/timergua.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2023-03-08 15:55:27 WIB; 17h ago
TriggeredBy: ○ timergua.timer
Main PID: 83135 (code=exited, status=0/SUCCESS)
CPU: 3ms
○ timergua.timer - Ini Timer Gua Untuk latihan
Loaded: loaded (/etc/systemd/system/timergua.timer; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2023-03-08 15:55:28 WIB; 17h ago
Trigger: n/a
Triggers: ● timergua.service
Oke selanjutnya kita bisa memulai service tersebut.
Jalankan service
Oke pada umumnya, katakan kita ingin menjalankan service mysql atau mssql atau apache, kita menggunakan syntax systemctl start mysql apache2.service mysql.service
namun pada kasus ini kita ingin membuat task scheduler. Maka dari itu, alih alih menjalankan *.service
kita akan menjalankan timer, dari timer akan mentriger service.
maruffarras@BrownTofu:/etc/systemd/system$ sudo systemctl start timergua.timer #(1)!
maruffarras@BrownTofu:/etc/systemd/system$ sudo systemctl start timergua.timer #(2)!
- Untun menjalankan service atau timer manual
- Untuk menjalankan service atau timer otomatis setiap system dinyalakan.
oke, sekarang mari kita lihat status dari task scheduler timergua.
maruffarras@BrownTofu:/etc/systemd/system$ sudo systemctl status timergua.*
○ timergua.service - Ini Timer Gua Untuk Latihan (Service)
Loaded: loaded (/etc/systemd/system/timergua.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Thu 2023-03-09 10:06:47 WIB; 1s ago
TriggeredBy: ● timergua.timer
Process: 146362 ExecStart=/home/maruffarras/learn/learn-ubuntu/update_date.sh (code=exited, status=0/SUCCESS)
Main PID: 146362 (code=exited, status=0/SUCCESS)
CPU: 4ms
Mar 09 10:06:47 BrownTofu systemd[1]: Started Ini Timer Gua Untuk Latihan (Service).
Mar 09 10:06:47 BrownTofu update_date.sh[146362]: Sistem path nya /home/maruffarras/learn/learn-ubuntu
Mar 09 10:06:47 BrownTofu update_date.sh[146362]: Jalanin ini lah
Mar 09 10:06:47 BrownTofu systemd[1]: timergua.service: Deactivated successfully.
Mar 09 10:06:49 BrownTofu systemd[1]: Started Ini Timer Gua Untuk Latihan (Service).
Mar 09 10:06:49 BrownTofu update_date.sh[146366]: Sistem path nya /home/maruffarras/learn/learn-ubuntu
Mar 09 10:06:49 BrownTofu update_date.sh[146366]: Jalanin ini lah
Mar 09 10:06:49 BrownTofu systemd[1]: timergua.service: Deactivated successfully.
● timergua.timer - Ini Timer Gua Untuk latihan
Loaded: loaded (/etc/systemd/system/timergua.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Thu 2023-03-09 10:04:50 WIB; 1min 59s ago
Trigger: Thu 2023-03-09 10:06:51 WIB; 1s left
Triggers: ● timergua.service
Mar 09 10:04:50 BrownTofu systemd[1]: Started Ini Timer Gua Untuk latihan.
Alhamdulillah service sudah berjalan. Highlight diatas adalah log dari service dan timer.
Catatan tambahan systemctl
Dalam menjalankan membuat service, menajalankan, memberhentikan dan lainnya kita menggunakan perintah systemctl
. Jadi apa sih itu systemctl ? berdasarkan manual page2 ubuntu, systemctl
adalah sebuah tool yang digunakan untuk mengintropeksi dan mengatur kondisi dari system dan service manager, disebut juga dengan systemd.
Untuk melihat daftar semua unit files dari service yang terinstall pada sistem anda dapat menggunakan sntax systemctl list-unit-files [PATTERN]
. Jika opsi pattern tidak digunakan akan mengeluarkan semua service yang terinstall dan jika diberikan akan mengeluarkan semua service yg cocok dengan pola tersebut.
maruffarras@BrownTofu:~$ sudo systemctl list-unit-files timergua*
UNIT FILE STATE VENDOR PRESET
timergua.service enabled enabled
timergua.timer enabled enabled
Jika anda ingin melihat system dan service manager yang hanya sedang berjalan (ada didalam memory) dapat menggunakan systemctl list-units [PATTERN]
untuk melihat list timer units menggunakan syntax systemctl list-timers [PATTERN]
.
Log service menggunakan journalctl
gunakan fungsi journallctl
untuk melihat live log dari service
Cron
Cron adalah alatyang dapat digunakan didalam sistem linux untuk membuat sebuah skedul atau mengotomasi proses-proses. toll tersebut membuat user dan administrato dapat meng-execute tugas-tugas pada waktu tertentun atau pada dalam interval waktu tertentu.
Untuk memasang cron daemon, kita harus menyimpan tugas didalam sebuah file yang diesebu dengan crontab dan memberitahu daemon kapan untuk menjalankan tugastersebut. Selanjutnya kita dapat membat sebuah schedule dan mengotomasi tugas-tugas dengan mengkonfigurasi cron daemon. Struktur dari cron terdiri dari komponen berikut.
Time Frame | Desription |
---|---|
Minutes (0-59) | Menspesifikasikan dalam menit berapa tugas harus dieksekusi |
Hours (0-23) | menspesifikasikan dalam jam berapa tugas harus dieksekusi |
Days of month (1-31) | Mensepsifikasikan hari berapa dalam satu bulan tugas harus dieksekusi |
Months (1-12) | Menspesifikasikan bulan berapa tugas harus dieksekusi |
Days of the week (0-7) | Menspesifikasikan hari keberapa dalam satu minggu tugas harus dieksekusi |
Sebagai contoh, conrtab terlihat seperti dibawah ini
# System Update
* */6 * * /path/to/update_software.sh #(1)!
# Execute scripts
0 0 1 * * /path/to/scripts/run_scripts.sh #(2)!
# Cleanup DB
0 0 * * 0 /path/to/scripts/clean_database.sh #(3)!
# Backups
0 0 * * 7 /path/to/scripts/backup.sh #(4)!
- Akan dijalankan setiap enam jam.
- Akan dijalankan setiap hari pertama dalam satu bulan pada tengah malam.
- Akan dijalankan pada setiap hari senin tengah malam
- Akan dijalankan pada setiap hari ahad tengah malam
Dengan crop memungkin anda untuk menerima notifikasi ketika sebuah tugas berhasil dieksekusi atau gagal. Dan kita juga dapat membuat sebuah logs untuk memonitor tugas-tugas yang dieksekusi.
Membuat scheduler dengan crontab
Crontab
adalah sebuah program yang digunakan untuk memasang (install), melepas (uninstall) atau daftar tabel yang digunakan untuk menggerakan daemon di vixie cron. setiap user memiliki crontab file masing masing yang terletak di /var/spool/cron/crontabs/<user-name>
Perintah crontab
memliki beberapa opsi.
opsi | deskripsi |
---|---|
-l |
Menampilkan current crontab dalam bentuk standard ouput, STNDOUT |
-u |
Digunakan unutk mensepesifikasikan user dalam membuat file crontab. Jika tidak menspesifikasin user maka akan membuat user current. |
-r |
Menghapus crontab dari current user |
-e |
Untuk mengedit current crontabe |
-i |
Mengeluarkan opsi make sure ketika menghapus current crontabe dengna opsi -r y/n |
Berbicara mengenai lokasi crontabe file di /var/spool/cron/crontabs/<user-name>
. Pengguna sangat tidak disarankan dan tidak iijinkan untuk meng-edit crontab file pada direktori tersebut untuk memastikan hanya user yang diijinkan oleh sistem untuk menambahkan tugas secara periodik pada crontab file dan menulis crontab yang sesuai dengan user (tidak mengubah crontab user lain). Dengan demikian memaksa direktorihanya dapat di tulis oleh crontab group.
Info
maruffarras@BrownTofu:~/learn/learn-ubuntu$ sudo ls -la /var/spool/cron/crontabs/
total 12
drwx-wx--T 2 root crontab 4096 Mar 8 11:10 .
drwxr-xr-x 3 root root 4096 Okt 13 2021 ..
-rw------- 1 maruffarras crontab 1139 Mar 8 11:10 maruffarras
Crontabe file dimiliki oleh current user dan group crontab. Permission read dan write hanya dimiliki oleh owner 600
.
Mari membuat tugas rutin dengan crontab
Jadi saya ingin membuat task sederhana yang mengupdate sebuah file txt
setiap satu menit. Update file tersebut berisikan tanggal hasil dari command date
. jadi ada dua langkah, pertama membuat sebuah file dengan ekstensi sh
agar dapat dijalankan oleh cron daemon, dan kedua membuat scheduler dengan crontab
.
export PATHME=~/learn/learn-ubuntu
echo "Sistem path nya $PATHME"
if ! [ -f $PATHME/date_list.txt ]; then
touch date_list.txt
echo "# This is the first line" > $PATHME/date_list.txt
else
echo "Jalanin ini lah"
date >> $PATHME/date_list.txt
fi
unset PATHME
Selanjut mari kita membuat scheduler pada crontab file menggunakan perintah crontab -e
3. Setelah menjalankan perintah tersebut pertama kali akan muncul STDOUT dan anda diperintahkan untuk memberikan STDIN terkait editor yang ingin dipakai untuk mengedit crontab file. Dibawah ini adalah interaktif shell untuk memilih editor.
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
Selanjutnya save file tersebut maka script kita akan dijalankan setiap menit. Dibawha ini adalah isi dari file date_list.txt
setelah beberapa menit cron daemon menjalankan script update_date.sh
# This is the first line
Rab 08 Mar 2023 11:04:01 WIB
Rab 08 Mar 2023 11:05:01 WIB
Rab 08 Mar 2023 11:06:01 WIB
Mengganti text-editor
Awal menjalan crontab pertama kali akan muncul interaktif shell untuk memilih text editor. Jika anda ingin menggati pilihan anda gunakan perintah text-editor
.
Systemd and Cron
Kedua fitur tersebut dapatdigunakan pada sistem linux untuk membuat sebuah skedul atau mengotomasi proses. Yang membedakan adalah cara mengkonfigurasinya. Systemd,anda harus membuat sebuah time dan script service yang memberitahu operating system kapan harus menjalankan tugas, dan disisi lain, cron, anda harus membuat sebuah crontab yang memberi tahu cron daemon kapan harus menjalankan tugas.
-
Dapat melihat lebih dari satu service ↩
-
Anda dapat merujuk ke getting information about command ↩
-
Disini tidak menggunakan opsi
-u
, dengan demikian akan menjadi current user. ↩