Sampai sekarang saya menggunakan
pidof -o %PPID -x "my-tool"
Untuk mendeteksi pid dari instance my-tool yang akhirnya berjalan.
Ini adalah versi singkat dari file alat saya, skrip bash yang dapat dieksekusi
#!/bin/bash
if pidof -o %PPID -x "my-tool"; then
echo "Already running"
exit 1
fi
... if not running go on
Tapi sekarang saya harus mengizinkan satu instance per pengguna dan beberapa per mesin , sehingga kami dapat menjalankan bahkan 100 perangkat saya pada saat yang sama, tetapi hanya 1 per pengguna.
Perhatikan bahwa saya perlu tes untuk membuat sesuatu seperti singleton. Jika alat akan dimulai dan ada contoh lain yang menjalankannya akan menutup sendiri.
Singkatnya: Saya perlu agar skrip bash dapat mendeteksi jika skrip tersebut sudah berjalan untuk pengguna saat ini dan dalam hal ini harus keluar.
Bagaimana caranya?
pidof
, ada alat yang lebih baik berbohongpgrep
Jawaban:
Gunakan
pgrep
sebaliknya:Opsi yang digunakan adalah:
Jika Anda ingin menggunakan ini dalam skrip bash yang memeriksa apakah sudah berjalan, Anda bisa menggunakannya
$0
. Ini memperluas ke jalan naskah saat ini (misalnya/home/username/bin/foo.sh
) tetapi kita hanya perlufoo.sh
. Untuk mendapatkan itu, kita dapat menghapus segala sesuatu sampai yang terakhir/
menggunakan bash alat manipulasi string :${0##*/}
. Ini berarti kita dapat melakukan sesuatu seperti:Anda mungkin juga ingin mempertimbangkan menggunakan file kunci untuk ini:
sumber
touch /tmp/$USER.foo.lock
saya akan menggunakan PID dari prosesecho $$ >/tmp/$USER.foo.lock
Kemudian logika dapat dimasukkan untuk menguji apakah proses tersebut benar-benar ada.$(< pidfile)
alih-alih$(cat pidfile)
.Anda dapat menggunakan
pgrep
fo find jika suatu proses sedang dijalankan oleh pengguna tertentu dan kemudian memulai proses jika belum berjalan oleh pengguna:Variabel lingkungan
$USER
,, akan diperluas ke pengguna yang saat ini masuk yaitu pengguna yang menjalankan skrip. Karena kami hanya tertarik pada apakahmy-tool
berjalan atau tidak, jadi hanya menggunakan status keluar secara langsung denganif
konstruk sudah cukup.Gunakan skrip ini sebagai pembungkus untuk memulai
my-tool
dan buat pengguna hanya menggunakan ini atau ganti namanyamy-tool
dan ganti nama aslinyamy-tool
menjadi yang lain (dan ubah nama di dalam skrip juga).sumber
Cobalah dengan cuplikan ini:
Penting untuk tidak menulis
pgrep|tr
karena ini akan bercabang menjadi shell bernama sama.sumber
Bungkus perintah yang ingin Anda jalankan dalam kawanan untuk memastikan bahwa hanya satu salinan yang berjalan pada satu waktu. Gunakan lock_file yang disimpan dalam pohon direktori home pengguna sehingga setiap pengguna memiliki file kunci mereka sendiri. Sebagai contoh:
'command' dapat berupa perintah atau skrip bash.
man flock
memberikan contoh penggunaansumber
flock
perintah sama sekali