GNU/Linux >> Belajar Linux >  >> Linux

Mengelola Duplikat Cron Job Saat Menjalankan Skrip

Jika selama beberapa waktu, Anda telah mengamati pola tertentu pada perangkat Linux Anda yang memicu alarm untuk penggunaan CPU/memori yang tinggi, disarankan untuk menganalisis serangkaian proses yang berjalan pada saat alarm.

Selama analisis, Anda mungkin menemukan bahwa proses atau skrip tertentu menjalankan beberapa instance secara bersamaan karena panggilan duplikat pada proses terjadwal (yang disiapkan menggunakan tugas cron).

Untuk mencegah hal ini terjadi, Anda dapat menggunakan dua alternatif:

Menyiapkan file kunci

Di dalam skrip, terapkan prosedur yang memverifikasi apakah ada file. Jika tidak, maka skrip akan membuatnya dan terus mengeksekusi seperti yang diharapkan. Jika file tidak diperlukan setelah skrip selesai, Anda dapat menghapusnya untuk memastikan menjalankan pekerjaan berikutnya tidak akan menganggapnya sebagai "sedang digunakan".

Menyiapkan file PID di BASH

Mirip dengan metode yang disebutkan di atas, menggunakan file ID Proses (PID) bergantung pada membaca file, dengan perbedaan bahwa di dalam file ini, PID dari instance yang berjalan ditempatkan, ini akan memungkinkan untuk memvalidasi bahwa proses jika proses sedang berjalan, sedangkan file kunci hanya memverifikasi bahwa skrip mulai berjalan, mengabaikan apakah skrip masih berjalan, atau jika skrip dihentikan sementara/dihentikan sebelum file dihapus.

Langkah-langkah untuk menyiapkannya:

Melalui cuplikan kode di bawah ini, Anda dapat melihat contoh kode yang akan Anda terapkan dalam skrip Anda. Teks yang dimulai dengan simbol pound (#) adalah komentar di dalam kode, sehingga dapat dihapus pada implementasi akhir.

CATATAN: Ketahuilah bahwa Anda harus terlebih dahulu menguji apakah skrip sesuai dengan kebutuhan Anda. Jangan berasumsi itu bisa berhasil pada percobaan pertama. Modifikasi mungkin diperlukan.

# A. Define your PID file using the full path where it'll be located.
# Do not place your code within any /tmp folder as these get cleaned up automatically and might interfere with the expected behaviour of the script.

# B. Check if the PID file exists, if it does, it will run the intended function.
PIDFILE = /var/apps/testscript.pid

# 1. Read the content of our PID file (with cat), and assign it to the PID variable
if [ -f $PIDFILE ] then
    # 2. Verify if the content of the file is a running process
    PID = $(cat $PIDFILE)

    # In here, the '%?' variable obtains the exit code from our previous command
    ps -p $PID > /dev/null 2>&1

    # 3. If the content of the file is a process (an output equal to 0 means succesful), output a message, and exit the application.
    if [ $? -eq 0 ] then
        echo "Job is already running"
        exit 1
    else
        # 4. If the exit code was not succesful, we assume the process was not running, so we place the current process ID into the PID File
        echo $$ > $PIDFILE
        if [ $? -ne 0 ] then
        echo "Could not create PID file"
        exit 1
        fi
    fi
# C. If the PID file does not exist, it will attempt to create it, then run the code
else
    # 1. This outputs the current PID into the PID file:
    #  The '$$' value is a variable for the current PID.
    #  The '>' operand directs the output from echo to a file
    echo $$ > $PIDFILE

    # 2. If the exit code was not succesful, output an error message, and exit the application.
    if [ $? -ne 0 ]
    then
        echo "Could not create PID file"
        exit 1
    fi
fi

# *** In here you need to insert the original script code *** #

# D. Remove the PID file so we try to always have a "clean slate"
rm $PIDFILE

Solusi lain

Selain dua alternatif di atas, ada utilitas berbeda yang dapat Anda terapkan.

Flock

Perintah kawanan adalah utilitas yang diinstal pada distribusi Linux baru yang mengelola kunci dari skrip shell

Anda dapat merujuk ke dokumentasi resmi di URL di bawah ini untuk memahami lebih lanjut tentang penggunaannya:

  • https://manpages.ubuntu.com/manpages/xenial/man1/flock.1.html

Hal yang berguna tentang kawanan adalah bahwa kunci file akan tetap di tempatnya sampai proses asli selesai, pada saat itu kawanan akan melepaskan kunci file. Ini benar apakah prosesnya berhasil atau tidak berhasil.

Solo

Solo adalah skrip Perl yang mengikat eksekusi skrip ke port jaringan alih-alih file,

Anda dapat merujuk ke situs web resmi untuk mendapatkan informasi lebih lanjut:

  • https://www.timkay.com/solo/.

Mirip dengan implementasi lain, ini akan membuat kunci yang hanya akan dilepaskan setelah skrip yang ditetapkan selesai:

$ ./solo -port=1234 /var/tmp/script.sh & 1234
$ ./solo -port=1234 /var/tmp/script.sh
solo(1234): Address already in use

Keuntungan mengikat port daripada file, adalah port tidak dapat dihapus. Yang dengan implementasi lain, akan 'melepaskan' kunci yang ada, memungkinkan contoh duplikat pekerjaan.

Catatan tambahan

Meskipun utilitas dan praktik di atas mencegah menjalankan tugas duplikat, penting untuk memantau cara cronjob Anda berinteraksi untuk menghindari tugas yang tumpang tindih atau penggunaan sumber daya yang berlebihan yang dapat menghambat kinerja perangkat dan operasi kami.

  • Perintah Kawanan
  • Skrip PERL solo.

Gunakan tab Umpan Balik untuk memberikan komentar atau mengajukan pertanyaan. Anda juga dapat memulai percakapan dengan kami.


Linux
  1. Pekerjaan Cron saya tidak berfungsi

  2. Tidak ada kesalahan file atau direktori saat menjalankan biner

  3. PID maksimum di Linux

  1. Cara Mengatur Pekerjaan Cron Di TrueNAS

  2. Portabilitas Tautan File Descriptor?

  3. Bagaimana cara melihat pekerjaan cron yang sedang berjalan?

  1. Encoding File Zip?

  2. Kapan File yang Dapat Dieksekusi Tidak?

  3. Masalah Crontab:Cron Job Tidak Berfungsi Saat Menggunakan Persentase