GNU bash, versi 1.14.7(1)
Saya memiliki sebuah skrip yang disebut "abc.sh
"
Saya harus memeriksa ini dari skrip abc.sh
saja...
di dalamnya saya telah menulis pernyataan berikut
status=`ps -efww | grep -w "abc.sh" | grep -v grep | grep -v $$ | awk '{ print $2 }'`
if [ ! -z "$status" ]; then
echo "[`date`] : abc.sh : Process is already running"
exit 1;
fi
Saya tahu itu salah karena setiap kali ia keluar karena menemukan prosesnya sendiri di ' ps'
bagaimana cara mengatasinya?
bagaimana saya bisa mengecek script itu sudah berjalan atau belum dari script itu
saja?
Cara yang lebih mudah untuk memeriksa proses yang sudah dijalankan adalah perintah pidof
.
if pidof -x "abc.sh" >/dev/null; then
echo "Process already running"
fi
Atau, minta skrip Anda membuat file PID ketika dijalankan. Kemudian, ini merupakan latihan sederhana untuk memeriksa keberadaan file PID untuk menentukan apakah proses sudah berjalan.
#!/bin/bash
# abc.sh
mypidfile=/var/run/abc.sh.pid
# Could add check for existence of mypidfile here if interlock is
# needed in the shell script itself.
# Ensure PID file is removed on program exit.
trap "rm -f -- '$mypidfile'" EXIT
# Create a file with current PID to indicate that process is running.
echo $$ > "$mypidfile"
...
Update:
Pertanyaannya sekarang telah berubah untuk memeriksa dari skrip itu sendiri. Dalam hal ini, kita akan berharap untuk selalu melihat setidaknya satu abc.sh
berjalan. Jika ada lebih dari satu abc.sh
, maka kita tahu proses itu masih berjalan. Saya masih menyarankan penggunaan perintah pidof
yang akan mengembalikan 2 PID jika prosesnya sudah berjalan. Anda dapat menggunakan grep
untuk menyaring PID saat ini, loop di shell atau bahkan kembali ke hanya menghitung PID dengan wc
untuk mendeteksi beberapa proses.
Berikut ini adalah contohnya:
#!/bin/bash
for pid in $(pidof -x abc.sh); do
if [ $pid != $$ ]; then
echo "[$(date)] : abc.sh : Process is already running with PID $pid"
exit 1
fi
done
Inilah satu trik yang akan Anda lihat di berbagai tempat:
status=`ps -efww | grep -w "[a]bc.sh" | awk -vpid=$$ '$2 != pid { print $2 }'`
if [ ! -z "$status" ]; then
echo "[`date`] : abc.sh : Process is already running"
exit 1;
fi
Tanda kurung di sekitar [a]
(atau pilih huruf yang berbeda) mencegah grep
menemukan dirinya sendiri. Hal ini membuat grep -v grep
tidak diperlukan. Saya juga menghapus grep -v $$
dan memperbaiki bagian awk
untuk mencapai hal yang sama.
Seseorang tolong tembak saya jika saya salah di sini
Saya mengerti bahwa operasi mkdir
bersifat atomik, jadi anda bisa membuat kunci direktori
#!/bin/sh
lockdir=/tmp/AXgqg0lsoeykp9L9NZjIuaqvu7ANILL4foeqzpJcTs3YkwtiJ0
mkdir $lockdir || {
echo "lock directory exists. exiting"
exit 1
}
# take pains to remove lock directory when script terminates
trap "rmdir $lockdir" EXIT INT KILL TERM
# rest of script here