grep gagal dalam skrip pemula

4

Saya memiliki konfigurasi pemula untuk layanan yang perlu memeriksa keberadaan proses pada startup itu. Ini kedengarannya cukup mudah tetapi saya sudah mencoba selama 3 jam untuk menyelesaikan masalah ini dan saya tersesat. Masalahnya tampaknya bahwa beberapa pernyataan grep menyebabkan keluarnya skrip dalam pemula, yang menyebabkan kegagalan dalam memulai layanan. Tetapi pemula tidak mencatat apa-apa, itu hanya keluar dari skrip dan hilang.

Berikut ini adalah beberapa contoh baris yang memicu masalah: Gema pertama dan keluaran grepnya dicatat, gema kedua dicatat, tetapi bukan keluaran grepnya. Setelah gema kedua baru saja keluar dari skrip dan berhenti. Masalahnya adalah menambahkan opsi -v atau sesuatu yang lain seperti menggunakan kelas regexp seperti [[: digit:]]. Sepertinya saya perlu melarikan diri beberapa karakter tetapi saya tidak tahu caranya. -V sederhana atau sesuatu seperti itu tidak berhasil.

script
  echo grep
  ps ax | grep "postgres: wal writer process" | grep "grep"
  echo grep2
  ps ax | grep "postgres: wal writer process" | grep -v "grep"
end script

Adakah yang tahu apa yang saya lakukan salah dan bagaimana cara memperbaikinya?

Thorsten Schöning
sumber

Jawaban:

5

Sebagaimana dijelaskan dalam manual , semua skrip dijalankan sh -e. Itu berarti setiap kegagalan perintah yang tidak ditangani akan menghentikan skrip dengan kesalahan. Jika Anda memiliki kode yang mungkin mengembalikan kegagalan, Anda akan menyukainya

command || true

atau membungkusnya dengan kondisional atau sesuatu.

Oleh oleh, kode Anda lebih baik ditulis sebagai

ps ax | grep "[p]ostgres: wal writer process"

Lihat juga https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

Jadi secara ringkas, Anda mungkin akan mencari sesuatu seperti

if ps aux | grep '[p]ostgres: wal writer process'
then
    : already running
else
    : start it up
fi

Sekarang itu grep dijalankan sebagai bagian dari kondisi, kegagalan tidak lagi dianggap tidak tertangani (bahkan jika Anda tidak memiliki else klausa!) dan itu akan berjalan dengan aman di bawah set -e.

tripleee
sumber
Pernyataan Anda juga tidak berfungsi, tapi sekarang saya pikir saya mengerti alasannya: Pernyataan itu seharusnya gagal jika tidak menemukan garis yang cocok yang merupakan kasus yang benar-benar valid. Setelah pernyataan grep saya memiliki if yang memeriksa kode kesalahan dari pernyataan terakhir, tetapi karena kode kesalahan 1 jika garis matematika tidak ditemukan dan "sh -e" jika tidak pernah tercapai. Tidak ada yang salah dengan karakter pelarian atau yang lainnya.
1
Anda harus memperbaikinya grep foo bar; if [ $? = 0 ]; then ... untuk yang lebih sederhana, lebih kuat, dan lebih idiomatis if grep foo bar; then ...
tripleee
Saya tidak bisa mendapatkan sesuatu seperti itu if [ ps ax | grep "postgres: wal writer process" | grep -v "grep" ] atau if [ ps ax | grep "[p]ostgres: wal writer process" ] bahkan tanpa [] membentuk if dan lolos | atau [p] untuk bekerja.
Mungkin lihat juga stackoverflow.com/questions/10586213/…
tripleee
1
Atau, untuk akal, if ps aux | grep "[p]ostgres: wal writer process"; then ... dan perhatikan khususnya tidak adanya tanda kurung di sekitar perintah.
tripleee