Skip to content

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

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.

Membuat timer
[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

maruffarras@BrownTofu:/etc/systemd/system$ sudo systemctl daemon-reload

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)!
  1. Untun menjalankan service atau timer manual
  2. 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

journalctl -f -u <nama_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)!
  1. Akan dijalankan setiap enam jam.
  2. Akan dijalankan setiap hari pertama dalam satu bulan pada tengah malam.
  3. Akan dijalankan pada setiap hari senin tengah malam
  4. 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.

~/learn/learn-ubuntu/update_date.sh
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 mari buat scheduler agar script dijalankan

crontab file current user
* * * * * . ~/learn/learn-ubuntu/update_date.sh

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.


  1. Dapat melihat lebih dari satu service 

  2. Anda dapat merujuk ke getting information about command 

  3. Disini tidak menggunakan opsi -u, dengan demikian akan menjadi current user.