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.
Artikel terkait
- Perintah Kawanan
- Skrip PERL solo.
Gunakan tab Umpan Balik untuk memberikan komentar atau mengajukan pertanyaan. Anda juga dapat memulai percakapan dengan kami.