Bagaimana saya bisa menentukan apakah suatu proses sedang berjalan atau tidak dan kemudian memiliki skrip bash mengeksekusi beberapa hal berdasarkan kondisi itu?
Sebagai contoh:
jika proses
abc
sedang berjalan, lakukan inijika tidak berjalan, lakukan itu.
zombie
proses '(Bukan apa yang saya gambarkan sebagai proses "berjalan"). Daftar lengkap apa yangSTAT
kolom nilai, dalam output darips
, menunjukkan di sini untuk mereka yang cenderung menulis jawaban yang mengakomodasi ini, atau mengedit sendiri.Jawaban:
Skrip bash untuk melakukan sesuatu seperti itu akan terlihat seperti ini:
Script ini hanya memeriksa untuk melihat apakah program "gedit" sedang berjalan.
Atau Anda hanya dapat memeriksa apakah program tidak berjalan seperti ini:
sumber
/dev/null
: "/ dev / null mengarahkan ulang output standar perintah ke perangkat null, yang merupakan perangkat khusus yang membuang informasi yang ditulis padanya" ... menggunakan0
akan mengarahkan output perintah ke file yang disebut0
. Dalam hal ini, saya sarankan menjadi lebih nyaman dengan> /dev/null
- Anda akan melihatnya di mana-mana, karena ini adalah cara standar / tepat untuk membuang output.-x
parameter untukpgrep
mencari aplikasi yang tepat atau jika tidak maka akan mendapatkan kesalahan yang benar jika menemukan string yang sama di dalam nama aplikasi lain. Saya hanya menghabiskan 1 jam untuk mencari tahu.! pgrep
Solusi apa pun yang menggunakan sesuatu seperti
ps aux | grep abc
ataupgrep abc
cacat.Mengapa?
Karena Anda tidak memeriksa apakah proses tertentu sedang berjalan, Anda memeriksa apakah ada proses yang berjalan yang cocok
abc
. Setiap pengguna dapat dengan mudah membuat dan menjalankan nama yang dapat dieksekusiabc
(atau yang mengandungabc
suatu tempat dalam nama atau argumennya), menyebabkan hasil positif palsu untuk pengujian Anda. Ada berbagai opsi yang dapat Anda terapkanps
,grep
danpgrep
untuk mempersempit pencarian, tetapi Anda masih tidak akan mendapatkan tes yang andal.Jadi, bagaimana cara saya andal menguji untuk proses berjalan tertentu?
Itu tergantung pada apa yang Anda butuhkan untuk tes.
Saya ingin memastikan bahwa layanan abc berjalan, dan jika tidak, mulai saja
Inilah tujuan init dan pemula. Mereka akan memulai layanan dan memastikan pidnya disimpan di pidfile. Cobalah untuk memulai layanan lagi (melalui init atau pemula) dan ia akan memeriksa pidfile, dan mulai jika tidak ada, atau batalkan jika sudah berjalan. Ini masih belum 100% andal, tapi sedekat yang Anda dapatkan.
Lihat Bagaimana saya dapat memeriksa untuk melihat apakah server permainan saya masih berjalan ... untuk solusi lain.
abc adalah skrip saya. Saya perlu memastikan hanya satu contoh skrip saya berjalan.
Dalam hal ini, gunakan file kunci atau file kunci. Misalnya
Lihat Bash FAQ 45 untuk cara mengunci lainnya.
sumber
pgrep
ataups
sangat memadai dan pendekatan Anda sepertinya berlebihan. Jika Anda menulis skrip untuk distribusi publik, Anda harus menulisnya dengan cara yang paling aman.rm
perintah dijalankan. Jadi selama itu berakhir setelah jebakan diatur, kunci harus hilang.Inilah yang saya gunakan:
Dalam bahasa Inggris biasa: jika 'pgrep' mengembalikan 0, proses sedang berjalan, jika tidak, maka tidak.
Bacaan terkait:
Bash Scripting :: Perbandingan String
Manual Ubuntu pgrep
sumber
pgrep
memiliki batas "fitur" 15 karakter yang sama yang disebutkan sebelumnya, jadi misalnyapgrep gnome-power-manager
juga akan gagal-x
opsi pgrep : "Hanya proses pencocokan yang namanya (atau baris perintah jika -f ditentukan) sama persis dengan polanya."Saya biasanya memiliki
pidof -x $(basename $0)
pada skrip saya untuk memeriksa apakah sudah berjalan.sumber
Mengisi gagasan @ rommel-cid, dapat Anda gunakan
pidof
dengan || (||) untuk menjalankan perintah jika prosesnya tidak ada dan && untuk menjalankan sesuatu jika prosesnya benar-benar ada, sehingga menciptakan persyaratan if / then / else yang cepat. Misalnya di sini ada satu dengan proses yang berjalan (browser chrome saya, yang nama prosesnya "chrome") dan satu pengujian untuk proses yang tidak ada. Saya menekan output standar menggunakan 1> / dev / null sehingga tidak mencetak:sumber
Tidak ada solusi "sederhana" yang bekerja untuk saya karena biner yang saya perlu periksa tidak diinstal di seluruh sistem, jadi saya harus memeriksa dengan path, yang pada gilirannya memerlukan menggunakan
ps -ef | grep
pendekatan:sumber
Hal pertama yang terlintas di benak saya untuk masalah Anda:
ps aux | grep -i abc
akan menunjukkan detail proses jika berjalan. Anda dapat mencocokkan jumlah garis atau waktu untuk menjalankannya dan membandingkannya dengan nol atau manipulasi lainnya. Ketika Anda menjalankan perintah di atas, ia akan menunjukkan kepada Anda setidaknya satu baris output yaitu detail tentang proses yang dibuat oleh perintah grep ini .. Jadi berhati-hatilah.Itu harus dilakukan sebagai hack sederhana. Masukkan ke dalam skrip bash dan lihat apakah itu membantu.
sumber
Menggunakan
start-stop-daemon
:Ini berfungsi sebagai pengguna normal.
sumber
Saya menemukan bahwa jawaban yang diterima yang diposting oleh @John Vrbanac tidak bekerja untuk saya, dan bahwa jawaban yang diposting oleh @geirha tidak menjawab pertanyaan awal.
Solusi John Vrbanac tidak bekerja untuk memeriksa apakah proses PHP berjalan atau tidak untuk saya, saya menjalankan CentOS 7.
Jawaban @ geirha hanya memastikan instance belum berjalan sebelum memulai yang lain. Ini bukan pertanyaan asli, pertanyaan asli adalah untuk memeriksa apakah suatu proses sedang berjalan atau tidak.
Inilah yang bekerja untuk saya:
Katakanlah proses saya memiliki string "Jane" dalam nama prosesnya. Ini akan menemukan apakah itu berjalan atau tidak. Ini berfungsi untuk skrip BASH dan PHP.
sumber
Catatan :
pgrep -x lxpanel
ataupidof lxpanel
masih laporan yanglxpanel
berjalan bahkan ketika sudah tidak aktif (zombie); jadi untuk mendapatkan proses yang hidup dan berjalan, kita perlu menggunakanps
dangrep
sumber
Pada 23 September 2016, pgrep tampaknya membutuhkan opsi "-x" agar skrip muru dapat berfungsi.
Saya mencoba dan menguji skrip di atas pada mesin Ubuntu 16.04.1. Nikmati!
sumber
sumber
isProcessRunning () {if [$ (pidof $ 1)> / dev / null]; lalu retval = 'true'; else retval = 'false'; fi; echo $ retval; }
isProcessRunning geany
benar
sumber