Uciekające postacie w cronie

9

Następujące działa zgodnie z oczekiwaniami z wiersza polecenia. Ale to nie działa z crona.

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

Otrzymuję następujący błąd:

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

Czy niektóre postacie wymagają ucieczki w cron? Czy jest to problem z podpowłoką w cronie?

shantanuo
źródło

Odpowiedzi:

13

Omówię to, co powiedział SvenW , stwierdzając, że wstawię to polecenie do skryptu z dwóch powodów:

  1. Pozwala to uniknąć problemów z ucieczką postaci w crontab.
  2. Pozwala jasno wskazać innym administratorom, co robi zadanie, nie marnując żadnego z ich cykli na odszyfrowanie stworzonej przez ciebie magii. Takich jak wywołanie skryptu /root/bin/dump_mysql_tables_and_email_failure_report.sh. Być może nie jesteś w środowisku z innymi administratorami, ale to pomoże ci przypomnieć sobie, o czym myślałeś za rok! :)
Kyle Smith
źródło
2
Uznanie za „co do cholery myślałeś za rok!”.
Tonny
5

Najłatwiejsze rozwiązanie problemów związanych z ucieczką crona: umieść polecenie we własnym skrypcie powłoki i po prostu wywołaj ten skrypt z crona.

Sven
źródło
5

Powodem, dla którego nie działa, jest to, że cronnie jest bash. Tworzenie podpowłoki za pomocą nawiasów jest częścią składni bash. Wskazówką na to jest pierwsze „słowo” komunikatu o błędzie.

Backticks działałby, aby utworzyć podpowłokę, z wyjątkiem tego, że już używasz backsicków w swojej podpowłoce, więc nie możesz ich ponownie użyć.

Jak już powiedzieli inni, napisz skrypt i wywołaj go z crona.

Ladadadada
źródło