Eseguire lo script in una shell non interattiva?


17

Ho un lavoro cron che esegue uno script. Quando eseguo lo script tramite una shell interattiva (ssh'ed to bash) funziona benissimo. Quando lo script viene eseguito da solo tramite cron, non riesce.

La mia ipotesi è che stia utilizzando alcune delle variabili ambientali impostate nella shell interattiva. Ho intenzione di risolvere i problemi dello script e rimuoverli.

Dopo aver apportato le modifiche, so di poter mettere in coda lo script in cron per farlo funzionare come farebbe normalmente, ma c'è un modo per eseguire lo script dalla riga di comando, ma dire che deve essere eseguito come da cron - cioè in un ambiente non interattivo?


Correlati e quindi probabilmente utili: "Come ottenere un ambiente pulito in una shell ksh?" vedi in particolare la risposta di @Gilles in merito unset.
sr_

1
Dal link di @ sr_, ho cercato enve potresti provare env -i ./my-script.sh. Inoltre, ricevi un messaggio di errore?
Kevin,

Quale implementazione cron stai usando?
rozcietrzewiacz,

@kevin - lo voterò se risponderai con esso.
Cwd,

Risposte:


12

Le principali differenze tra l'esecuzione di un comando da cron e l'esecuzione nella riga di comando sono:

  • cron sta probabilmente usando una shell diversa (generalmente /bin/sh);
  • cron è sicuramente in esecuzione in un piccolo ambiente (che dipende dall'implementazione di cron, quindi controlla la pagina man cron(8)o crontab(5); in genere c'è solo HOME, forse SHELL, forse LOGNAME, forse USER, e una piccola PATH);
  • cron tratta il %personaggio appositamente (viene trasformato in una nuova riga);
  • i lavori cron vengono eseguiti senza un terminale o un ambiente grafico.

La seguente chiamata eseguirà lo snippet di shell praticamente come se fosse stato invocato da cron. Presumo che lo snippet non contenga i caratteri 'o %.

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

Vedi anche l' esecuzione di uno script sh dal cron , che potrebbe aiutare a risolvere il tuo problema.


Ciao @Giles - ho solo pensato a qualcosa - eseguire uno script come sudo -u user /path/to/scriptsarebbe anche un modo per eseguirlo senza alcuna variabile impostata?
Cwd,

@cwd No, di solito no. sudocancella alcune variabili e ne imposta altri su un valore noto, ma ciò dipende da come è configurato. È spesso configurato per conservare le impostazioni locali e TERM, ad esempio.
Gilles 'SO- smetti di essere malvagio' il

2

Dal link di @ sr_ ( Come ottenere un ambiente pulito in una shell ksh? ), Ho cercato env e potresti provare questo:

env -i ./my-script.sh

Questo ha funzionato bene per me, anche se la risposta di @Gilles è davvero buona.
Cwd,

@cwd: non funziona per me: echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shoutput interactive himB.
Alix Axel,

1

Ti suggerirei di usare percorsi assoluti per i tuoi script quando li metti in cron e usi altrove e per tutti i comandi linux usati in esso, meglio dichiararli come variabili e usarli!


sì. ma certo.
Cwd,

0

Cron non usa necessariamente la stessa shell che stai usando. dai un'occhiata:

cat /etc/crontab |grep SHELL

Per determinare la shell e tentare l'esecuzione del tuo script lì, funziona? Questa è una causa comune di problemi per molte persone che aggiungono script a cron.

Se questo è il problema, puoi aggiungere "bash" all'inizio del tuo script in cron per forzare l'esecuzione di questo script in bash. Se questo non risolve il problema, fammi sapere e approfondirò un po 'più a fondo.


0

Se desideri ignorare alcune domande interattive fornite da alcuni script, puoi provare:

yes | your_command

O yes "n" se desideri No tutte le domande.

Comando:

si - sii ripetutamente affermativo si output espletivo, o, per impostazione predefinita, 'y', per sempre.


0

Per eseguire lo script in una shell non interattiva (non relativa ai dettagli di cron), è possibile farlo tramite ssh.

Prova se finisci davvero in una shell non interattiva:

> ssh someuser@somehost tty
not a tty

Esegui lo script in una shell non interattiva:

> ssh someuser@somehost /tmp/myscript.sh
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.