grep thất bại trong kịch bản mới nhất


4

Tôi có một cấu hình mới nhất cho một dịch vụ cần kiểm tra sự tồn tại của một quá trình khi khởi động. Điều này nghe có vẻ khá dễ dàng nhưng tôi đã cố gắng trong 3 giờ để giải quyết vấn đề này và tôi đã lạc lối. Vấn đề dường như là một số câu lệnh grep dẫn đến việc thoát khỏi tập lệnh trong khi mới bắt đầu, dẫn đến thất bại trong việc bắt đầu dịch vụ. Nhưng mới bắt đầu không đăng nhập bất cứ điều gì, nó chỉ thoát khỏi tập lệnh và biến mất.

Sau đây là một số dòng ví dụ gây ra sự cố: Tiếng vang đầu tiên và đầu ra của grep được ghi lại, tiếng vang thứ hai được ghi lại, nhưng không phải là đầu ra của grep. Sau tiếng vang thứ hai, khởi động lại, thoát khỏi tập lệnh và dừng lại. Vấn đề là thêm tùy chọn -v hoặc một cái gì đó khác như sử dụng các lớp regrec như [[: chữ số:]]. Có vẻ như tôi cần phải thoát khỏi một số nhân vật nhưng đơn giản là tôi không biết làm thế nào. Một -v đơn giản hoặc một cái gì đó như thế không hoạt động.

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

Có ai có ý tưởng về những gì tôi đang làm sai và cách khắc phục vấn đề không?

Câu trả lời:


5

Như được giải thích trong hướng dẫn , tất cả các kịch bản chạy với sh -e. Điều đó có nghĩa là bất kỳ lỗi lệnh nào chưa được xử lý sẽ chấm dứt tập lệnh có lỗi. Nếu bạn có mã có thể trả về thất bại, bạn sẽ mã như thế nào

command || true

hoặc bọc nó trong một điều kiện hoặc một cái gì đó.

Bởi, mã của bạn được viết tốt hơn là

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

Xem thêm https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

Vì vậy, tóm lại, có lẽ bạn sẽ tìm kiếm một cái gì đó như

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

Bây giờ, nó grepđược điều hành như một phần của điều kiện, một lỗi không còn được coi là chưa được xử lý (ngay cả khi bạn không có một elsemệnh đề!) Và vì vậy nó sẽ chạy an toàn theo set -e.


Tuyên bố của bạn cũng không hoạt động, nhưng bây giờ tôi nghĩ tôi hiểu lý do: Tuyên bố được cho là thất bại nếu nó không tìm thấy bất kỳ dòng khớp nào là trường hợp hoàn toàn hợp lệ. Sau các câu lệnh grep tôi có một if kiểm tra mã lỗi của câu lệnh cuối cùng, nhưng vì mã lỗi là 1 nếu không tìm thấy dòng toán học và "sh -e" nếu không bao giờ đạt được. Không có gì sai với các nhân vật thoát hoặc người khác.

1
Bạn nên sửa lỗi grep foo bar; if [ $? = 0 ]; then ...đơn giản hơn, mạnh mẽ hơn và thành ngữ hơnif grep foo bar; then ...
tripleee

Tôi không thể có được thứ gì đó giống if [ ps ax | grep "postgres: wal writer process" | grep -v "grep" ]hoặc if [ ps ax | grep "[p]ostgres: wal writer process" ]thậm chí không có [] hình thành nếu và thoát | hoặc [p] để làm việc.


1
Hoặc, để dí dỏm, if ps aux | grep "[p]ostgres: wal writer process"; then ...và đặc biệt chú ý sự vắng mặt của dấu ngoặc vuông xung quanh các lệnh.
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.