Tại sao sử dụng `bash -c` trong trình giám sát thay vì gọi trực tiếp tập lệnh?


11

Tôi đang bắt đầu sử dụng supervisordđể kiểm soát các dịch vụ trong máy chủ của mình. Tôi không phải là người dùng chuyên nghiệp của linux nhưng có thể sử dụng nó khá tốt và chạy nó.

Vì tò mò, tôi đã nhận thấy rằng hầu hết các lệnh trong giám sát dường như được gọi là:

[program:install]
command=bash -c "/src/etc/install.sh"

Tôi đã đọc người đàn ông của bash và biết rằng -cnên sử dụng để chèn các biến được truyền sau chuỗi.

Vì vậy, điểm nào trong việc sử dụng bash -ctrong giám sát viên (hoặc bất kỳ nơi nào khác) thay vì gọi trực tiếp tập lệnh (như ví dụ dưới đây), xem xét rằng không có biến nào được thông qua / sử dụng?

[program:install]
command=/src/etc/install.sh

Cảm ơn!

Câu trả lời:


11

Shell tính năng như mở rộng tên đường dẫn ( *, ?), danh sách lệnh ( ;, &&, ||), chuyển hướng ( <, >, |,) không được thực hiện bởi supervisord rằng chỉ có tách lệnh vào một mảng các chuỗi đối số.

Đây bash -ccó thể chỉ là một trợ giúp cho người dùng mới làm quen, những người có thể bị cám dỗ sử dụng các tính năng như vậy trong lệnh. Ví dụ, nó tránh được sự ngạc nhiên rằng

command=echo foo > /tmp/bar

đầu ra foo > /tmp/barthay vì viết foovào /tmp/bar.

-ccó ít liên quan đến các biến. Bất kỳ đối số bổ sung cho bash sẽ chỉ có sẵn như các đối số kịch bản $0, $1vv trong lệnh, nhưng tính năng có hiếm khi sử dụng bất kỳ. Ví dụ bash -c 'echo $0 $0' foođầu ra foo foo.


1
Cảm ơn, đó là một câu trả lời rất thực dụng và có lẽ sẽ giúp tôi tiết kiệm rất nhiều thời gian. Tôi, với tư cách là một người dùng mới làm quen, sẽ phạm phải sai lầm này (và không bao giờ nghĩ đó bash -clà một giải pháp!).
Daniel Costa

6

Nó được giải thích trong tài liệu :

Không có shell nào được giám sát thực thi khi nó chạy một quy trình con, do đó các biến môi trường như USER, PATH, HOME, SHELL, LOGNAME, v.v. không được thay đổi từ mặc định của chúng hoặc được gán lại. Điều này đặc biệt quan trọng cần lưu ý khi bạn đang chạy một chương trình từ một giám sát viên chạy dưới quyền root với user = stanza trong cấu hình.

Để giải quyết vấn đề này bash -ccó thể được sử dụng.


2
Đánh dấu, cảm ơn câu trả lời của bạn nhưng tôi nghĩ rằng câu hỏi kia là một kịch bản hợp lý hơn (trong khi câu trả lời của bạn không đúng với tôi, tôi vẫn cần chọn một câu trả lời đúng ..). Ngoài ra, tôi cũng đang giúp người dùng mới có ít điểm hơn.
Daniel Costa
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.