Lo script non viene eseguito tramite crontab ma funziona autonomamente


51

Ho uno script che mi ricorda di riavviare il mio computer se uptimeè più di, diciamo 3 giorni (anche se è impostato su 0 giorni ora solo per verificare se lo script è in esecuzione poiché il mio computer è attivo solo da un giorno ..).

Mi rendo conto che non è la sceneggiatura più elegante ma ci sto provando! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

L'ho reso eseguibile da chmod + x checkup.she funziona benissimo quando lo eseguo dal terminale via./checkup.sh

La mia voce crontab per questo script è:

46 14 * * * /home/username/Desktop/./checkup.sh

Quindi funziona alle 14: 46 ore al giorno ...

Quindi ... sto pensando che dovrebbe funzionare, a meno che non abbia fatto qualcosa di veramente sciocco. Inoltre, pensi che sia giusto spostare questo script bash in /bin?


1
Lo metterei in / opt / bin o ~ / bin come best practice generale per non confondere dove i pacchetti pensano che le cose siano.
RobotHumans

Se esegui lo script in questo modo: /home/dnaneet/Desktop/./checkup.sh funziona? Vorrei mettere /home/dnaneet/Desktop/checkup.sh
LnxSlck

@LnxSlck Sì, l'esecuzione /home/dnaneet/Desktop/./checkup.shfunziona correttamente . Ma /home/dnaneet/Desktop/checkup.shpotrebbe non funzionare bene? Perché ha bisogno di un ./?
caroN

1
Non credo che cron sappia nulla della tua sessione X.
Glenn Jackman,

@glennjackman Quindi cosa significa? Vuol dire che l'esecuzione di un tale script tramite crontab non consente la visualizzazione di un messaggio pop-up nell'ambiente gnome?
caroN,

Risposte:


71

Una cosa alla volta:

Prima diamo una cartella bin basata sull'utente:

cd ~/ && mkdir bin

Vuoi usare crontab. Cominciamo con qualcosa di veramente semplice:

* * * * * touch /tmp/testing.txt

Va bene, quindi funziona

Ora proviamo a eseguire uno script che fa lo stesso

* * * * * /home/username/bin/touchtest.sh

per eseguire una volta al minuto fino a quando non funziona.
No, non è necessario un ./ nel mezzo della linea. ./ è per quando stai fornendo URL relativi.
Va bene, quindi funziona

Ora proviamo a eseguire uno script che chiama xmessage

* * * * * /home/username/bin/rebootwarn.sh

non funziona

Innanzitutto non dobbiamo dipendere da variabili d'ambiente. Ciò include l'impostazione del percorso, le impostazioni x11 o qualsiasi altra cosa (le variabili di ambiente Python e Ruby vengono in mente ...)

Facciamo in modo che il nostro assomigli un po 'al file cron corretto di anacron ... L'ho salvato come test

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Imposta per eseguire una volta al minuto

crontab test per importarlo

Sulla sceneggiatura

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Va bene, quindi funziona ... cosa abbiamo fatto?
Abbiamo cambiato tutti i comandi per non dipendere da percorsi che non avevamo impostato esplicitamente.
Abbiamo eseguito il nostro script in modo esplicito con bash.
Abbiamo detto allo script che ci aspettiamo di essere su DISPLAY: 0.0


Grazie per la risposta. Hai detto "Facciamo in modo che il nostro assomigli un po 'al file cron corretto di Anacron ... L'ho salvato come test" .. IL NOSTRO cosa? Il file crontab? :-/
caroN

Ecco cosa ho osservato. Per prima cosa ho dovuto liberarmi dello spazio prima e dopo =per la specifica della linea DISPLAY. In secondo luogo, quando ho modificato il mio file crontab e l'ho aggiunto PATHcome suggerito e impostato il tempo di esecuzione in un secondo momento, la finestra a comparsa non veniva visualizzata. Tuttavia, la finestra popup ha mostrato bene quando si esegue lo script utilizzando /bin/bash... cosa offre?
caroN

Cosa sai, una volta che ho cambiato la mia sceneggiatura export DISPLAY=:0.0, ha funzionato bene. Anche se c'è stato un significativo lang di circa 5 secondi dopo che l'orologio ha suonato l'ora in cui la mia finestra a comparsa avrebbe dovuto mostrare ... Qualche suggerimento? Ma sì, i tuoi emendamenti alla sceneggiatura funzionano!
caroN

Nessuna idea sul ritardo di 5 secondi.
RobotHumans

3
Adoro il modo in cui hai attraversato questo passaggio per gradi e poi lo hai riassunto - grazie!
jbobbins,

10

Il problema è stato risolto leggi il manuale in Google:

descrizione:

  1. Ho script usando #!/bin/bashcome intestazione
  2. Ho messo la sceneggiatura /home/wc3/palert/

analisi:

  1. crontab non può eseguire il mio script
  2. Ma se eseguo manualmente mostra l'output e anche io posso vedere il risultato sul mio web
  3. Significa che crontab non può ottenere l'ambiente non come quando si esegue lo script nella cartella degli script

risposta:

  1. metti il ​​tuo ambiente usando questa riga sotto sul tuo script con:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    cambia questo: /home/wc3/palert
    con: il posto in cui hai inserito la tua sceneggiatura, ad es/home/budi/script.sh

campione:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Prova a mettere il tuo script su crontab.


non funziona per me
John Joe,

Lavora come un incantesimo per me!
1rq3fea324wre
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.