Bisakah saya membuat baris perintah bash yang hanya menjalankan perintah tertentu jika prosesnya belum berjalan (di latar belakang)?
Bagaimana saya memeriksa *, jika suatu perintah sudah berjalan?
(jadi saya bisa menambahkan perintah berikutnya dengan &&
di antara mereka sehingga yang berikutnya hanya dijalankan jika yang pertama benar).
*: uji, tentukan, temukan, cari tahu
ps -ef | grep -v grep | grep "process_name" || run_command_here
pgrep "process_name"
sebagai gantips | grep | grep
Jawaban:
Gunakan daemontools . Anda dapat menggunakan
svok
untuk memeriksa apakah proses layanan / daemon / latar belakang sedang berjalan.Untuk metode lain, lihat:
sumber
Saya telah menggunakan teknik ini dari waktu ke waktu:
Sebelum
pgrep
itu dulu dilakukan dengan cara ini:contoh
Bit dengan
[p]
membuatnya sehinggagrep
tidak akan menemukan dirinya sebagai hasilnya.sumber
Ini bisa rumit, karena Anda dapat memiliki contoh terpisah dari proses yang sama yang hidup secara mandiri. Misalnya server mendengarkan pada port yang berbeda, atau layanan berjalan sebagai pengguna yang berbeda. Untuk membedakan di antara contoh-contoh ini, Anda perlu memberi mereka masing-masing tag unik. Tag sering berupa file, tetapi bisa berupa soket lokal di namespace abstrak, port TCP, dll. - pengidentifikasi unik apa pun akan melakukannya. Ketika tag adalah file, itu bisa berupa file biasa yang berisi ID proses (pidfile), atau pipa atau soket bernama tempat file itu mendengarkan, dll. Idealnya, tag adalah titik akhir komunikasi yang memungkinkan klien untuk terhubung untuk proses itu.
Setiap jenis tag yang berbeda ini menghasilkan cara yang berbeda untuk memeriksa apakah instance yang Anda cari sudah aktif dan berjalan. Misalnya, dengan soket file lokal, coba sambungkan ke sana, dan mulai prosesnya jika tidak ada proses mendengarkan pada soket itu. Jika tag tersebut adalah pidfile, periksa apakah ada proses dengan ID proses itu, tetapi berhati-hatilah bahwa ini rapuh, karena jika prosesnya telah mati, mungkin ada proses yang tidak terkait yang telah menggunakan kembali ID-nya. Berhati-hatilah bahwa jika dua klien mencoba mencapai proses dalam kerangka waktu yang singkat, mereka mungkin menemukan bahwa proses tersebut tidak ada dan keduanya berusaha untuk memulainya; melindungi dengan benar dari kondisi balapan ini bisa rumit.
Lebih mudah untuk mengelola instance ketika mereka semua dimulai oleh proses penyelia yang sama, dan proses pengawas mendeteksi ketika instance mati dan bereaksi sesuai. Banyak program pemantauan layanan yang dapat melakukan ini.
Jika program tidak merespons pada titik akhir komunikasi yang diketahui dan tidak dikelola oleh program pengawas, tag orang miskin adalah pidfile: file yang berisi ID proses. Saat Anda memulai proses, tulis pid ke file dengan nama yang sudah diatur sebelumnya. Ketika Anda membutuhkan proses untuk eksis, baca pidfile dan lihat apakah ada proses dengan pid itu. Saat Anda membunuh prosesnya, hapus pidfile. Masalah yang paling menonjol dengan pidfile yang tidak diawasi adalah bahwa jika proses mati, pidnya dapat digunakan kembali oleh beberapa proses yang tidak terkait. Anda setidaknya harus memeriksa nama proses atau proses yang dapat dieksekusi untuk memastikan bahwa Anda berbicara dengan proses yang benar. Banyak varian unix yang memiliki perintah pgrep :
pgrep SOMENAME
mencantumkan proses yang namanya mengandung SOMENAME sebagai substring, dengan opsi tambahan untuk membatasi pengguna tertentu, untuk memerlukan kecocokan yang tepat, untuk mengubah mana dari beberapa kemungkinan gagasan "nama proses" yang digunakan, dll.sumber
Anda bisa menggunakan pendekatan ini:
sumber
Pilihan lain:
pgrep -xq processname
ps -eo comm= | sed 's|.*/||' | grep -xq processname
sed 's|.*/||'
menghapus bagian dirname pada OS XDalam GNU / Linux
ps -o comm
memotong nama perintah menjadi 15 karakter danpgrep
danps -C
hanya cocok dengan 15 karakter pertama.ps -C
(nama perintah kecocokan) tidak didukung pada OS X.Dalam OS X
ps -o comm
mencetak jalur absolut perintah danps -co comm
hanya mencetak nama perintah. Di GNUps -o comm
hanya mencetak nama perintah dan-c
memiliki arti berbeda.Pgrep OS X tidak termasuk proses leluhur (seperti bash, Terminal, atau launchd) tanpa
-a
. Pgrep GNU memasukkan mereka secara default dan tidak mendukung-a
.grep -x
danpgrep -x
jangan menyiratkan-F
, jadi gunakan-Fx
jika nama proses dapat berisi karakter regex.sumber
Maaf, tetapi semua solusi ini tidak mendukung contab karena baris perintah yang sama akan muncul dua kali dalam hasil 'ps'.
Jadi inilah milik saya:
sumber
cron
pekerjaan?Dengan Bash
Catatan: - hapus
echo
jika output terlihat OK.sumber
Saya akan menjelaskan kasus di mana Anda menjalankan perintah di beckgreoud. "$!" simpan PID dari proses latar belakang terakhir. Jadi, Anda dapat menggunakannya untuk menemukannya di tabel proses mengikuti jawaban di atas:
Perintah builtin "pekerjaan" - coba ini:
Mengenai opsi "&&"
Alih-alih && gunakan perintah tunggu. Pada contoh berikut ini, myproc2 tidak akan berjalan sampai myproc1 selesai:
sumber
Dapatkan status proses Anda:
ps -lp $(pgrep <YOUR_PROCESS_NAME>) | tail -1 | awk '{print $11}'
Referensi:
Sebagai contoh, saya telah menggunakannya untuk memutar atau menghentikan sementara proses sox saya pada sesi tmux:
sumber
Anda dapat menggunakannya di dalam skrip:
sumber