Що не так з моїм синтаксисом cronjob, я намагаюся використовувати backtick (`)?


31

Ось що я хотів би автоматизувати:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

Ось повідомлення про помилку:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

2
Окрім помилки надання, подумайте, як це ввести у сценарій schell. Це зробить вигляд, що кронтаб є незграбним, і ви можете додавати коментарі та конфігурувати у свій файл сценарію.
PeterMmm

Відповіді:


67

З crontab (5) :

Поле "шосте" (решта рядка) визначає команду, яку потрібно виконати. Вся командна частина рядка, до нового рядка або символу%, буде виконуватися в / bin / sh або оболонці, зазначеній у змінній SHELL файлу crontab. Знаки відсотків (%) у команді, якщо не уникнути зворотної косої риски (), будуть змінені в символи нового рядка, і всі дані після першого% будуть відправлені в команду як стандартне введення. Немає способу розділити один командний рядок на кілька рядків, як, наприклад, оболонка "\".

Просто додайте зворотні риски перед знаками%:

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

8

Щоб вирішити проблему, уникайте своїх символів% . date +%Y-%m-%dмає бутиdate +\%Y-\%m-\%d

На жаль, ця відповідь трохи пізня, але питання не є PATH або backticks - питання полягає лише в тому, що відсотковий символ '%' є спеціальним символом, який використовується для позначення NEWLINE або STDIN у записах на кроні .

Це суперечить введенню dateкоманди для форматування . Як така команда, яка включає: date +%Y-%m-%dбуде інтерпретуватися як:

date Y- m- d


4

У мене також було багато проблем із задніми планками. Іноді вам потрібно не одне виникнення цитат та зворотних посилань. Просто замініть їх на $ ().

Приклад:

export NOW=`date`
by
export NOW=$(date)

-Гілсон Соарес


1
+1 Цей синтаксис улюблений сьогодні.
Ден Карлі

4
але це не має нічого спільного з питанням користувача.
Аарон Браун

1
Звичайно ж, про задники, читайте питання ще раз.
Серхіо Абреу

Дякую, мені знадобилося певний час, коли я зрозумів, що задні руйнування ламають мої крони - я почав використовувати $ () у всіх своїх сценаріях і зараз
Ерік Кігаті

-2

Це не має нічого спільного з backsticks. Жахлива річ у тому, що крон НЕ бачить ПУТУ, і ви ОБОВ'ЯЗКОВЕ сказати cron "що таке ПАТ"? знову і знову в сценаріях cron.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

І я за те, щоб записати команду у файл, а не передати команду буквально в рядок cron. Це набагато елегантніше

* * * * * /your/script/here

ніж

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

цей рядок може містити один файл, chmod + x файл, і цей файл повинен бути викликаний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.