Thoát nhân vật trong cron


9

Sau đây hoạt động như mong đợi từ dấu nhắc lệnh. Nhưng nó không hoạt động từ cron.

mysqldumpslow <(tail -1000 `mysqladmin variables \
    | grep slow_query_log_file | awk '{print $4}'`) \
    | mail -s "slow log from `hostname` sorted by time" shantanu.oak`hostname`@gmail.com \
    > /root/slow_succ.txt 2> /root/slow_err.txt

Tôi nhận được lỗi sau đây:

/bin/sh: -c: line 0: syntax error near unexpected token `('

Do một số nhân vật cần phải được thoát trong cron? Hoặc nó là một vấn đề với subshell trong cron?


Câu trả lời:


13

Tôi sẽ mở rộng những gì SvenW đã nói bằng cách tuyên bố rằng tôi sẽ đưa lệnh này vào một kịch bản vì hai lý do:

  1. Nó tránh mọi vấn đề với các nhân vật thoát trong crontab.
  2. Nó cho phép bạn chỉ ra rõ ràng cho các quản trị viên đồng nghiệp của mình những gì công việc thực hiện mà không lãng phí bất kỳ chu kỳ nào của họ để giải mã ma thuật một lớp mà bạn đã tạo. Chẳng hạn như gọi kịch bản /root/bin/dump_mysql_tables_and_email_failure_report.sh. Bạn có thể không ở trong một môi trường với các quản trị viên khác, nhưng điều này sẽ phục vụ để nhắc nhở bạn những gì bạn đã nghĩ một năm kể từ bây giờ! :)

2
Kudos cho "cái quái gì bạn đã nghĩ một năm kể từ bây giờ!".
Tonny

5

Giải pháp đơn giản nhất cho các vấn đề thoát cron: Đặt lệnh trong tập lệnh shell của chính nó và chỉ cần gọi tập lệnh này từ cron.


5

Lý do nó không hoạt động cronlà không bash. Tạo một lớp con bằng cách sử dụng dấu ngoặc là một phần của cú pháp bash. Một manh mối cho điều này là trong "từ" đầu tiên của thông báo lỗi.

Backticks sẽ hoạt động để tạo một subshell ngoại trừ việc bạn đã sử dụng backticks bên trong subshell của bạn để bạn không thể sử dụng chúng một lần nữa.

Như những người khác đã nói, viết một kịch bản và gọi nó từ cron.

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.