cron에서 이스케이프 문자 -s “slow log from `hostname` sorted by

다음은 명령 프롬프트에서 예상대로 작동합니다. 그러나 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에서 특정 문자를 이스케이프해야합니까? 또는 cron의 서브 쉘에 문제가 있습니까?



답변

다음 두 가지 이유로이 명령을 스크립트에 넣 겠다고 말함으로써 SvenW가 말한 것을 확장 할 것입니다.

  1. crontab에서 이스케이프 문자와 관련된 문제를 피합니다.
  2. 그것은 당신이 만든 one-liner 마술을 해독하는주기를 낭비하지 않고 동료 관리자에게 작업이 무엇을하는지 명확하게 표시 할 수있게합니다. 스크립트 호출과 같은 /root/bin/dump_mysql_tables_and_email_failure_report.sh. 당신은 다른 관리자와 환경에 있지 않을 수도 있지만, 이것은 당신이 지금부터 1 년 동안 무슨 생각 하고 있었는지 상기시켜 것입니다! 🙂

답변

크론 이스케이프 문제에 대한 가장 쉬운 해결책 : 명령을 자체 쉘 스크립트에 넣고 cron에서이 스크립트를 호출하십시오.


답변

그것이 작동하지 않는 이유 cron는 그렇지 않습니다 bash. 대괄호를 사용하여 서브 쉘을 작성하는 것은 bash 구문의 일부입니다. 이에 대한 힌트는 오류 메시지의 첫 번째 “단어”에 있습니다.

백틱은 서브 쉘에서 이미 백틱을 사용하고 있으므로 다시 사용할 수 없다는 점을 제외하고 서브 쉘을 작성하는 데 효과적입니다.

다른 사람들이 이미 말했듯이 스크립트를 작성하고 cron에서 호출하십시오.