Perché mettere uno script in /etc/cron.hourly non funziona?


16

Ho inserito uno script eseguibile /etc/cron.hourly, ma quello script non è stato eseguito ogni ora, in realtà non viene mai eseguito.

Ecco la sceneggiatura (Ora-suono) che ho realizzato:

#! / Bin / bash
mplayer ~ / Music / sfx_msg-highlight.wv &> / dev / null &
spd-say -r -50 -p 50 -t male3 "Adesso sono $ (data +"% l% p ")"
notifica-invia "È:" "$ (data +"% l% p ") ora." -i ~ / Immagini / "first tee.png" -t 5000

Il mio crontab è:

DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /home/naruto/Hour-sound.sh

Mentre i comandi mplayere spd-sayvengono eseguiti correttamente, non lo notify-sendè. Ho anche provato a reindirizzare l'errore a un file:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

Ma questo non ha mostrato risultati. Che cosa sto facendo di sbagliato?


solo assicurandoti, hai reso eseguibile lo script? di proprietà di root? cosa succede quando si esegue lo script dal terminale o si inserisce un semplice script lì? FA /etc/crontabha la run-partslinea per l'esecuzione di orari crondi lavoro dalla directory?
heemayl

Eseguibile: sì, l'esecuzione dello script va bene nulla di male dalla directory /etc/cron.hourly, non sai come controllare questo? È nelle applicazioni di avvio? @heemayl
Black Block,

1
Il /etc/crontabfile ha la linea 17 * * * * root cd / && run-parts --report /etc/cron.hourly?
heemayl


1
Si prega di non pubblicare schermate di testo . Soprattutto quando quel testo viene visualizzato in una finestra terminale trasparente e include colori che distraggono.
terdon,

Risposte:


24

Come probabilmente hai visto nei commenti alla tua domanda, i cronjob /etc/cron.hourly(e le altre directory simili) vengono eseguiti da run-parts. run-partsè un po 'esigente riguardo ai nomi dei file. Per impostazione predefinita, non esegue file i cui nomi di file contengono qualcosa di diverso da (tutti quelli di ASCII)

  • lettere maiuscole
  • lettere minuscole
  • cifre
  • sottolineature
  • trattini ("segni meno")

Quindi, se il tuo script ha un nome file, ad esempio "myscript.sh", viene semplicemente ignorato, perché run-partsnon piace il punto.


1- Ecco i miei file: mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2- Hai provato qualche script in /etc/cron.hourly e hai lavorato con te?
Black Block,

2
Ho appena testato uno script litte che ha appena scritto "Hello" in un file in / tmp e ha funzionato senza problemi. Per ogni evenienza, sei consapevole che gli script in /etc/cron.hourlynon vengono necessariamente eseguiti "all'ora"? Se il tuo cronjob /etc/crontabha 17 nella posizione dei minuti, gli script vengono eseguiti alle 00:17, 01:17 e così via. E ancora nel caso, i permessi dello script consentono all'utente root di eseguirli?
Henning Kockerbeck,

Sì, ma quella mia sceneggiatura non corre mai in nessun momento. e per il permesso vedere qui: mediafire.com/view/psnb4bflawdlyly/…
Black Block

Forse è in realtà un problema di autorizzazione. So che gli script in generale /etc/cron.d/non devono avere autorizzazioni di scrittura o esecuzione per "gruppo" o "altri". "proprietario" deve disporre dell'autorizzazione di esecuzione, "gruppo" e "altri" devono avere solo l'autorizzazione di lettura. Forse questo vale anche per /etc/cron.hourly, anche se non l'ho provato.
Henning Kockerbeck,

Ok, allora ho cambiato l'autorizzazione per il mio file mediafire.com/view/s2lq63u7z54ohbo/… che rende il gruppo che è il gruppo principale di sola lettura e altri, quindi questo creerà problemi?
Black Block,

5

Un problema è che stai cercando di eseguire un'applicazione grafica ( notify-send) da cron. Ci vuole un po 'di modifiche. Devi impostare XAUTHORITYe DISPLAYvariabili nel crontab in modo che possa connettersi alla tua sessione X in esecuzione e devi impostare in XDG_RUNTIME_DIRmodo che possa connettersi alla tua sessione pulseaudio. Sfortunatamente, questi devono essere impostati nel crontab stesso, quindi non puoi usarli /etc/cron.hourly. Invece, esegui crontab -ee aggiungi queste righe:

DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /path/to/script.sh 

Cambia il valore di XDG_RUNTIME_DIRqualunque cosa sia restituita quando echoli dai da un terminale. Sul mio sistema, questo è:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

Probabilmente sarà lo stesso sul tuo, ma controlla prima. Ora, il tuo script verrà eseguito ogni ora e dovrebbe funzionare come previsto.


È quello che vuoi dire mediafire.com/view/ucjpvu8b41n3hue/… . questo non ha funzionato per me.
Black Block,

Penso che se il problema fosse nell'avviso di invio, allora perché anche altri comandi non sono stati eseguiti (come mplayer)?
Black Block,

@BlackBlock ci sono più problemi. i) ha notify-sendbisogno di essere impostato le variabili XAUTHORITYe DISPLAYe ii) mplayerdeve XDG_RUNTIME_DIRessere impostato. Hai provato il mio suggerimento? Ciò dovrebbe risolvere entrambi i problemi. Probabilmente hai anche avuto problemi di denominazione a causa di run-partscome spiegato nell'altra risposta.
terdon,

Allora perché questo non ha funzionato per me? sarò pazzo! vedi la mia immagine nel 1 ° commento alla tua risposta
Black Block,

@BlackBlock no! Stai modificando /etc/crontab, non farlo. Volete che questo venga eseguito come utente, non come root e quel file ha comunque un formato diverso. Fai solo quello che ho detto nella mia risposta, corri crontab -ee aggiungi le righe lì.
terdon,

3

Uno script che termina con .shnon viene eseguito nella /etc/cron.hourlycartella:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911
Collegamenti o binari all'interno di una directory gestita da run-pars (come /etc/cron.daily) non funzioneranno se un periodo fa parte di il loro nome.

rinominare lo script

mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound

o inserire la call script in

/etc/crontab

che permette il .shfinale


1

Non utilizzare lo script con estensione (abc.sh) e aggiungere il posto necessario. (cron.hours).

aggiungi il tuo codice al file abc e salva. (per le tue necessità) (questo dovrebbe essere il comando bash)

uso

sudo chmod +x abc

comando per creare file eseguibile.

edit etc/cronrtab file

ci sono alcune righe predefinite. modifica dalla riga dei minuti alle ore e salvala.

quindi funzionerà correttamente.

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.