หนีตัวละครใน cron


9

การทำงานต่อไปนี้เป็นไปตามที่คาดไว้จากพรอมต์คำสั่ง แต่มันไม่ทำงานจาก 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

ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

อักขระบางตัวจำเป็นต้องถูกหลบหนีด้วย cron หรือไม่? หรือเป็นปัญหากับ subshell ใน cron?


ทำซ้ำserverfault.com/questions/274475/หรือไม่
Hubbitus

คำตอบ:


13

ฉันจะขยายสิ่งที่SvenWพูดโดยระบุว่าฉันจะใช้คำสั่งนี้เป็นสคริปต์ด้วยเหตุผลสองประการ:

  1. มันหลีกเลี่ยงปัญหาใด ๆ กับการหลบหนีตัวละครใน crontab
  2. ช่วยให้คุณระบุผู้ดูแลระบบเพื่อนของคุณอย่างชัดเจนว่างานทำอะไรโดยไม่ต้องเสียวัฏจักรของพวกเขาในการถอดรหัสเวทมนต์แบบหนึ่งครั้งที่คุณสร้างขึ้น /root/bin/dump_mysql_tables_and_email_failure_report.shเช่นเรียกสคริปต์ คุณอาจไม่ได้อยู่ในสภาพแวดล้อมร่วมกับผู้ดูแลระบบรายอื่น ๆ แต่สิ่งนี้จะช่วยเตือนคุณว่าคุณคิดยังไงกับอีกหนึ่งปีนับจากนี้! :)

2
รุ่งโรจน์สำหรับ "สิ่งที่คุณกำลังคิดห่ามปีจากนี้!"
Tonny

5

ทางออกที่ง่ายที่สุดสำหรับปัญหาการหลบหลีกของ cron: ใส่คำสั่งในเชลล์สคริปต์ของตัวเองและเรียกใช้สคริปต์นี้จาก cron


5

เหตุผลที่มันไม่ได้ทำงานก็คือไม่ได้cron bashการสร้าง subshell โดยใช้เครื่องหมายวงเล็บเป็นส่วนหนึ่งของ bash syntax เงื่อนงำนี้อยู่ใน "คำแรก" ของข้อความข้อผิดพลาด

Backticks จะทำงานเพื่อสร้าง subshell ยกเว้นว่าคุณกำลังใช้ backticks ใน subshell ของคุณอยู่ดังนั้นคุณจึงไม่สามารถใช้ backticks ได้อีก

ดังที่คนอื่น ๆ พูดแล้วเขียนสคริปต์และเรียกสิ่งนั้นจาก cron

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.