Cosa c'è di sbagliato nella mia sintassi cronjob, sto cercando di usare un backtick (`)?


31

Ecco cosa vorrei automatizzare:

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

Ecco il messaggio di errore:

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

2
A parte l'errore di dare, considera di metterlo in uno script schell. Farà finta che il crontab sia goffo e tu puoi aggiungere commenti e config al tuo file di script.
PeterMmm,

Risposte:


67

Da crontab (5) :

Il campo `` sesto '' (il resto della riga) specifica il comando da eseguire. L'intera porzione di comando della riga, fino a una nuova riga o carattere%, sarà eseguita da / bin / sh o dalla shell specificata nella variabile SHELL del file crontab. I segni di percentuale (%) nel comando, a meno che non vengano salvati con la barra rovesciata (), verranno modificati in caratteri di nuova riga e tutti i dati dopo il primo% verranno inviati al comando come input standard. Non è possibile dividere una singola riga di comando su più righe, ad esempio "\" finale della shell.

Basta aggiungere barre rovesciate prima dei segni%:

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

8

Per risolvere il problema, evita i tuoi% caratteri . date +%Y-%m-%ddovrebbe esseredate +\%Y-\%m-\%d

Sfortunatamente questa risposta è un po 'in ritardo ma il problema non è PATH o backtick: il problema è semplicemente che il carattere percentuale'% 'è un carattere speciale usato per indicare una NEWLINE o una STDIN nelle voci crontab .

Ciò è in conflitto con l'input di formattazione del datecomando. Come tale comando che include: date +%Y-%m-%dsarà interpretato come:

date Y- m- d


4

Ho avuto anche molti problemi con i backtick. A volte è necessaria più di un'occorrenza di virgolette e backtick. Sostituiscili semplicemente per $ ().

Esempio:

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

-Gilson Soares


1
+1 Questa è la sintassi preferita al giorno d'oggi comunque.
Dan Carley,

4
ma non ha nulla a che fare con la domanda dell'utente.
Aaron Brown,

1
certo che ha, si tratta di backsticks, leggere di nuovo la domanda.
Sergio Abreu,

Grazie, mi ci è voluto un po 'di tempo per rendermi conto che i backtick mi stavano rompendo i croni - ho iniziato a usare $ () anche in tutti i miei script ora
Eric Kigathi il

-2

Non ha nulla a che fare con i backstick. Una cosa terribile è che cron NON vede il PERCORSO, e DEVI dire a cron "cos'è il PERCORSO?" ancora e ancora negli script cron.

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

E sono a favore di scrivere il comando in un file invece di passare il comando letteralmente nella cron line. È molto più elegante da avere

* * * * * /your/script/here

di

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

queste righe possono andare all'interno di un file, chmod + x file e questo file da invocare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.