Bash script per recuperare orario job schedulato

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

Salve a tutti
a crontab ho inserito l'esecuzione di uno script che mi schedula degli eventi.
Ora vorrei con altro script, recuperare l'orario del job che nella description ha un determinato valore, che corrisponde ad un parametro passato.

Con il comando atq riesco a visualizzare tutti i dettagli dei job inseriti

Codice: Seleziona tutto

atq | awk '{ print "at -c " $1 }' | bash
se inserisco anche il grep, mi fa vedere solo le righe con quella parola.

A me invece interessa recuperare il dettaglio dell'orario del job che visualizzo con il comando atq, ma vedo però solo il numero del job

Spero di aver spiegato la mia esigenza

grazie a tutti
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

se vuoi che awk stampi l'orario devi mettere $5 e non $1
man di at ha scritto: atq lists the user's pending jobs, unless the user is the superuser; in that case, everybody's jobs are listed. The format of the output lines (one for each job) is: Job number, date, hour,
queue, and username.
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

rai ha scritto:
lunedì 14 giugno 2021, 18:14
se vuoi che awk stampi l'orario devi mettere $5 e non $1
man di at ha scritto: atq lists the user's pending jobs, unless the user is the superuser; in that case, everybody's jobs are listed. The format of the output lines (one for each job) is: Job number, date, hour,
queue, and username.
purtroppo non mi da il risultato sperato
[22:57:38] root@raspy:/home/openhabian# atq | awk '{ print "at -c " $5 }' | bash | grep "tap"
at: unknown jobid: 05:27:00[22:57:41] root@raspy:/home/openhabian#
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Bash script per recuperare orario job schedulato

Messaggio da vaeVictis »

Ciao, posta l'output del comando intermedio atq.
E indica chiaramente quale campo di quell'output vorresti ottenere.

Io non ho nulla di schedulato e altrimenti non posso aiutarti.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

Dall'ultimo output postato (dove l'orario é presente) direi che il problema sta piuttosto a valle di awk.
Personalmente io non ho capito quale sia il risultato atteso dell'intera catena di pipe, specie se termina con un grep
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

rai ha scritto:
martedì 15 giugno 2021, 6:41
Dall'ultimo output postato (dove l'orario é presente) direi che il problema sta piuttosto a valle di awk.
Personalmente io non ho capito quale sia il risultato atteso dell'intera catena di pipe, specie se termina con un grep
Grazie mille per l'aiuto, e scusami per la poca chiarezza.
Cerco di spiegare meglio il desiderato.

Se visualizzo i job schedulati con atq ho questo output

Codice: Seleziona tutto

[11:56:11] root@raspy:/home/openhabian# atq
346     Wed Jun 16 05:27:00 2021 a root
345     Tue Jun 15 21:49:00 2021 a root
poiché i singoli orari compresa la data li voglio recuperare per farli visualizzare successivamente ad oggetti differenti, ho necessità di capire prima a quale oggetto appartiene (tap2 e tap3 come si può vedere nello script)

Codice: Seleziona tutto

[12:10:34] root@raspy:/home/openhabian# atq | awk '{ print "at -c " $1 }' | bash
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
SUDO_GID=0; export SUDO_GID
SUDO_COMMAND=/var/www/script/SH/tramAlbaORA.sh\ tap2\ down\ 10\ A\ A; export SUDO_COMMAND
SUDO_USER=root; export SUDO_USER
PWD=/root; export PWD
LOGNAME=root; export LOGNAME
HOME=/root; export HOME
LANG=it_IT.UTF-8; export LANG
USER=root; export USER
SHLVL=0; export SHLVL
LC_ALL=en_US.UTF-8; export LC_ALL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
SUDO_UID=0; export SUDO_UID
MAIL=/var/mail/root; export MAIL
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
sudo python /var/www/script/runTapESP.py tap2 down job

#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
SUDO_GID=0; export SUDO_GID
SUDO_COMMAND=/var/www/script/SH/tramAlbaORA.sh\ tap3\ down\ 40\ T\ R; export SUDO_COMMAND
SUDO_USER=root; export SUDO_USER
PWD=/root; export PWD
LOGNAME=root; export LOGNAME
HOME=/root; export HOME
LANG=it_IT.UTF-8; export LANG
USER=root; export USER
SHLVL=0; export SHLVL
LC_ALL=en_US.UTF-8; export LC_ALL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
SUDO_UID=0; export SUDO_UID
MAIL=/var/mail/root; export MAIL
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
sudo python /var/www/script/runTapESP.py tap3 down job
spero di essere riuscito a dare una migliore panoramica

Grazie ancora in anticipo
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

Dimmi se ho capito: tu vuoi mettere in relazione l'output di atq (numeri di job e data/orario) con l'output di at -c nnn (da cui puoi identificare il tipo di job schedulato al n. nnn) ?

Quanti tipi di job diversi devi distinguere oltre tap2 e tap3?
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

rai ha scritto:
martedì 15 giugno 2021, 17:52
Dimmi se ho capito: tu vuoi mettere in relazione l'output di atq (numeri di job e data/orario) con l'output di at -c nnn (da cui puoi identificare il tipo di job schedulato al n. nnn) ?

Quanti tipi di job diversi devi distinguere oltre tap2 e tap3?
Si esatto
Al momento posso avere tap1, tap2 e tap3, ma non escludo eventuali ulteriori discriminanti che mi devono identificare l’orario/data del job schedulato (dipende dalla mia immaginazione che mi farà sviluppare altro 😃)
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

Non riesco a fare tutto con awk come speravo, comunque potresti provare ad adattare alle tue esigenze questo codice:

Codice: Seleziona tutto

while read nnn day m d h _; do
    for job in tap1 tap2 tap3; do
        at -c $nnn | grep -q $job && echo "$nnn $h $job"
    done
done < <(atq)
nelle intenzioni dovrebbe dare in output per ogni job su linee differenti il numero di job, l'orario, l'identificativo del job. Poi sarà semplicissimo il parsing che ti serve
In ogni caso l'output puoi modificarlo alla bisogna (comma separated, aggiungere altri campi etc)
Idem puoi/devi adattare la sequenza dei `tapn` su cui ciclare
Fai sapere
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

rai ha scritto:
mercoledì 16 giugno 2021, 13:43
Non riesco a fare tutto con awk come speravo, comunque potresti provare ad adattare alle tue esigenze questo codice:

Codice: Seleziona tutto

while read nnn day m d h _; do
    for job in tap1 tap2 tap3; do
        at -c $nnn | grep -q $job && echo "$nnn $h $job"
    done
done < <(atq)
nelle intenzioni dovrebbe dare in output per ogni job su linee differenti il numero di job, l'orario, l'identificativo del job. Poi sarà semplicissimo il parsing che ti serve
In ogni caso l'output puoi modificarlo alla bisogna (comma separated, aggiungere altri campi etc)
Idem puoi/devi adattare la sequenza dei `tapn` su cui ciclare
Fai sapere
Perfetto!!! funziona alla grande!!!
[14:19:29] root@raspy:/var/www/script/SH# ./nJob.sh
347 21:50:00 tap3
348 05:28:00 tap2
ora lo miglioro rendendolo parametrico, in modo che passo per ogni oggetto il suo valore

Grazie ancora
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

Grazie a rai sono riuscito a mettere in piedi questo script
valTap=$1

while read nnn day m d h _; do
#for job in tap1 tap2 tap3; do
for job in $valTap; do
#at -c $nnn | grep -q $job && echo "$nnn $day $m $d $h $job"
at -c $nnn | grep -q $job && echo "$day $m $d $h"
done
done < <(atq)
ora sto cercando di far visualizzare anche lo stato, che può essere up, down, sun e rain, ma facendo altro ciclo all'interno, non mi tira fuori quel che mi serve
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

ora sto cercando di far visualizzare anche lo stato, che può essere up, down, sun e rain, ma facendo altro ciclo all'interno, non mi tira fuori quel che mi serve
Posta il codice completo dello script che usi per ottenere il risultato che hai scritto
posta la riga di comando con cui lo esegui, l'output che ottieni e un esempio di quello che invece vorresti ottenere
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

rai ha scritto:
giovedì 17 giugno 2021, 16:55
ora sto cercando di far visualizzare anche lo stato, che può essere up, down, sun e rain, ma facendo altro ciclo all'interno, non mi tira fuori quel che mi serve
Posta il codice completo dello script che usi per ottenere il risultato che hai scritto
posta la riga di comando con cui lo esegui, l'output che ottieni e un esempio di quello che invece vorresti ottenere
Ecco il codice che sto usando

Codice: Seleziona tutto

valTap=$1

while read nnn day m d h _; do
    #for job in tap1 tap2 tap3; do
    for job in $valTap; do
        if [ search=$(at -c $nnn | grep -q "$job sun") ]; then
           echo "$nnn $day $m $d $h $job sun"
        elif [ search=$(at -c $nnn | grep -q "$job up") ]; then
          echo "$nnn $day $m $d $h $job up"
        elif [ search=$(at -c $nnn | grep -q "$job down") ]; then
          echo "$nnn $day $m $d $h $job down"
        elif [ search=$(at -c $nnn | grep -q "$job rain") ]; then
          echo "$nnn $day $m $d $h $job rain"
        fi
    done
done < <(atq)
l'output è questo, ma non è quello atteso

Codice: Seleziona tutto

[16:58:53] root@raspy:/var/www/script/SH# ./Job.sh tap3
349 Fri Jun 18 05:28:00 tap3 sun
350 Thu Jun 17 21:50:00 tap3 sun
mi aspetterei solo questo

Codice: Seleziona tutto

350 Thu Jun 17 21:50:00 tap3 sun
dal momento che il dettaglio dei due job è

Codice: Seleziona tutto

[17:02:50] root@raspy:/var/www/script/SH# at -c 349
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
SUDO_GID=0; export SUDO_GID
SUDO_COMMAND=/var/www/script/SH/tramAlbaORA.sh\ tap2\ down\ 10\ A\ A; export SUDO_COMMAND
SUDO_USER=root; export SUDO_USER
PWD=/root; export PWD
LOGNAME=root; export LOGNAME
HOME=/root; export HOME
LANG=it_IT.UTF-8; export LANG
USER=root; export USER
SHLVL=0; export SHLVL
LC_ALL=en_US.UTF-8; export LC_ALL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
SUDO_UID=0; export SUDO_UID
MAIL=/var/mail/root; export MAIL
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
sudo python /var/www/script/runTapESP.py tap2 down job

Codice: Seleziona tutto

[17:04:03] root@raspy:/var/www/script/SH# at -c 350
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
SUDO_GID=0; export SUDO_GID
SUDO_COMMAND=/var/www/script/SH/tramAlbaORA.sh\ tap3\ sun\ 40\ T\ R; export SUDO_COMMAND
SUDO_USER=root; export SUDO_USER
PWD=/root; export PWD
LOGNAME=root; export LOGNAME
HOME=/root; export HOME
LANG=it_IT.UTF-8; export LANG
USER=root; export USER
SHLVL=0; export SHLVL
LC_ALL=en_US.UTF-8; export LC_ALL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
SUDO_UID=0; export SUDO_UID
MAIL=/var/mail/root; export MAIL
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
sudo python /var/www/script/runTapESP.py tap3 sun job
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

OK più tardi me lo leggo e mi faccio sentire
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

L'errore è che hai voluto complicare una cosa semplice ;)

nella condizione if tu metti nel test la assegnazione di un valore a una variabile; il fatto che quel valore derivi da una command substitution che può risultare Vera o Falsa è irrilevante: in ogni caso il comando di assegnazione avrà successo e il test risulterà Vero.
Per questo tutti gli elif verranno sempre ignorati e verrà sempre stampato il primo degli echo

Se invece dell'operatore logico AND && usato da me, preferisci il costrutto if...then... non è necessario fargli valutare l'exit status del comando test
puoi fargli valutare direttamente l'exit status del _tuo_ comando;

Codice: Seleziona tutto

$ if echo 123 | grep -q 123 ; then echo TRUE; else echo FALSE; fi
TRUE
$ if echo 123 | grep -q 321 ; then echo TRUE; else echo FALSE; fi
FALSE
$ 
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

rai ha scritto:
giovedì 17 giugno 2021, 18:36
L'errore è che hai voluto complicare una cosa semplice ;)

nella condizione if tu metti nel test la assegnazione di un valore a una variabile; il fatto che quel valore derivi da una command substitution che può risultare Vera o Falsa è irrilevante: in ogni caso il comando di assegnazione avrà successo e il test risulterà Vero.
Per questo tutti gli elif verranno sempre ignorati e verrà sempre stampato il primo degli echo

Se invece dell'operatore logico AND && usato da me, preferisci il costrutto if...then... non è necessario fargli valutare l'exit status del comando test
puoi fargli valutare direttamente l'exit status del _tuo_ comando;

Codice: Seleziona tutto

$ if echo 123 | grep -q 123 ; then echo TRUE; else echo FALSE; fi
TRUE
$ if echo 123 | grep -q 321 ; then echo TRUE; else echo FALSE; fi
FALSE
$ 
risolto, grazie mille

Codice: Seleziona tutto

valTap=$1

while read nnn day m d h _; do
    #for job in tap1 tap2 tap3; do
    for job in $valTap; do
        if at -c $nnn | grep -q "$job sun" ; then
           echo "$nnn $day $m $d $h $job sun"
        elif at -c $nnn | grep -q "$job up" ; then
          echo "$nnn $day $m $d $h $job up"
        elif at -c $nnn | grep -q "$job down" ; then
          echo "$nnn $day $m $d $h $job down"
        elif at -c $nnn | grep -q "$job rain" ; then
          echo "$nnn $day $m $d $h $job rain"
        fi
    done
done < <(atq)
rdie77
Prode Principiante
Messaggi: 51
Iscrizione: sabato 21 gennaio 2017, 22:57
Sesso: Maschile

Re: Bash script per recuperare orario job schedulato

Messaggio da rdie77 »

Ora però sta sorgendo altra esigenza ;-)

Cerco di spiegare meglio prima di tutto il contesto.
La variabile Tap rappresenta una tapparella elettrica, e Sun, Up, Rain e Down la loro posizione.

Poichè le posizioni delle tapparelle le sto schedulando con uno script che calcola l'alba ed il tramonto, posso decidere che la medesima tapparella potrebbe avere più posizioni schedulate (tenendo conto che all'ora di tramonto e alba posso applicare un tempo di anticipo e ritardo).

Da questa premessa consegue che lo script oggetto del mio post, serve solo per visualizzare la posizione schedulata.
Se ora ho appunto più posizioni, come posso fare per farle visualizzare?

Grazie ancora a tutti
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Bash script per recuperare orario job schedulato

Messaggio da rai »

Ammesso di aver capito :-)
Invece di usare if... elif... che sono reciprocamente esclusivi (un solo blocco viene eseguito), hai provato a mettere una serie di if semplicemente consecutivi?
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: nik1404, TommyB1992 e 7 ospiti