Re: bash in at command

2022-10-06 Per discussione Piviul

On 03/10/22 12:10, Piviul wrote:
Ciao a tutti, c'è un modo impostare l'esecuzione automatica di un bash 
script usando atd? Quando lo imposto viene usato sh ma io vorrei 
proprio usare bash


Grazie mille a tutti quanti in particolare ad Alessandro da cui ho 
imparato parecchio. Ora mi è tutto più chiaro. Dal man di at leggo:


-f file Reads the job from file rather than standard input.

Io trovo questa frase un po' cryptica, comunque intende dire che con 
l'opzione -f legge i comandi dal file invece che inviare il nome del 
file allo standard input.


Così ad esempio questi 2 comandi sono equivalenti

$ at now < /path/to/the/script.sh
$ at -f /path/to/the/script.sh now

e i comandi contenuti nel file vengono interpretati da /bin/sh; ma anche 
questi sono equivalenti


$ echo /path/to/the/script.sh | at now
$ at now
at>/path/to/the/script.sh
at>Ctrl-d

e i comandi vengono inviati da sh al kernel e quindi viene letta la sheebang

Buona serata a tutti

Piviul




Re: bash in at command

2022-10-06 Per discussione Piviul

On 05/10/22 18:35, Alessandro Rubini wrote:

strano... da shell at legge l'interprete da utilizzare dal file stesso
mentre con l'opzione -f lo esegue con /bin/sh.

No. Il comportamento e` uguale: passare da stdin o con "-f" con cambia
niente: viene salvato da qualche parte per poi essere passato a /bin/sh.
Cosi` dice la documentazione, cosi` ho fatto vedere che si comporta
(dire se uno script asincrono ha fallito o no non e` banale, fargli
fare "ps $$ > /dev/tty" e` facile e da` risultati certi. Si veda
il mio messaggio.


eseguire nella shell il  comando "#!/bin/sh" non produce nessun effetto 
essendo un commento. Se invece esegui un file sh sempre da shell at 
viene letto lo sheebang ed interpretato non più da sh ma dallo sheebang. 
Perché affermi che "dire se uno script asincrono ha fallito o no non e` 
banale"; guardare il codice di errore a me sembra semplice ed efficace 
mentre il tuo comando non l'ho capito; ho capito il senso ma non mi 
funziona e non ho capito bene cosa faccia. Scusa ma non tutti hanno le 
tue conoscenze!




Comunque sia che si lanci lo script da shell at, con il comando at -f,
direttamente da shell sh o con il comando sh -c, viene utilizzata sempre
la stessa shell /bin/sh

Se faccio "sh -c" ovviamente parte sh. Se faccio "bash -c" parte bash.


questo è lapalissiano, non ho capito cosa vuoi dire...


Probabilmente chiamare at con il parametro -f  [...]

Ragazzi, e` tutto *molto* piu` facile. "at" e` vecchio, e come tale
usa /bin/sh come interprete. Probabilmente niente, e` cosi` e basta.
Ricordiamo che le cose fatte bene sono facili, senza casi speciali.
"-f" non e` un caso speciale, e` *come* dare da stdin.


secondo me questo non è vero: at -f ignora lo sheebang, la shell at no. 
Se metti lo sheebang nella shell at è chiaro che viene interpretato da 
sh per quello che è, un commento.


Almeno secondo il mio empirismo; se però riesci a mostrarmi il contrario 
ben venga!


Grazie mille

Piviul



Re: bash in at command

2022-10-05 Per discussione Alessandro Rubini
>>> strano... da shell at legge l'interprete da utilizzare dal file stesso
>>> mentre con l'opzione -f lo esegue con /bin/sh.

No. Il comportamento e` uguale: passare da stdin o con "-f" con cambia
niente: viene salvato da qualche parte per poi essere passato a /bin/sh.
Cosi` dice la documentazione, cosi` ho fatto vedere che si comporta
(dire se uno script asincrono ha fallito o no non e` banale, fargli
fare "ps $$ > /dev/tty" e` facile e da` risultati certi. Si veda
il mio messaggio.

> Comunque sia che si lanci lo script da shell at, con il comando at -f, 
> direttamente da shell sh o con il comando sh -c, viene utilizzata sempre 
> la stessa shell /bin/sh

Se faccio "sh -c" ovviamente parte sh. Se faccio "bash -c" parte bash.

> Probabilmente chiamare at con il parametro -f  [...]

Ragazzi, e` tutto *molto* piu` facile. "at" e` vecchio, e come tale
usa /bin/sh come interprete. Probabilmente niente, e` cosi` e basta.
Ricordiamo che le cose fatte bene sono facili, senza casi speciali.
"-f" non e` un caso speciale, e` *come* dare da stdin.

> [...] fara` direttamente una chiamata execve (che non so cosa sia ma
> riporto quel che hai scritto tu) al kernel che mi sembra di aver
> capito non va a leggere la shebang dello script...

Invece e` proprio l'opposto.

Se un eseguibile e` eseguibile, viene eseguito (che sia python o che,
se ha il suo #! o altri trucchi a posto, dopo "chmod +x" e` eseguibile
ed esegue).  Se invece qualcuno dichiara di volere un testo
da passare a /bin/sh, lo passa a /bin/sh. E "#!/bin/basta" e` un
commento, come e` giusto che sia.

> quindi non si potranno nemmeno chiamare script in altri 
> linguaggi (php, python etc...).

Tutto cio` che e` eseguibile puo` essere eseguito da /bin/sh.

E` semplice e lineare. Non inventiamo complicazioni che non ci sono.

saluti
/alessandro



Re: bash in at command

2022-10-05 Per discussione Piviul

On 05/10/22 15:07, Giuseppe Sacco wrote:

Il giorno mer, 05/10/2022 alle 14.36 +0200, Piviul ha scritto:

On 05/10/22 12:15, Giuseppe Sacco wrote:

[...]
Qualcosa del tipo:
$ echo "bash -c /path/completo/script" | at 06:15

in effetti così funziona però il comportamento mi sembra abbastanza
strano... da shell at legge l'interprete da utilizzare dal file stesso
mentre con l'opzione -f lo esegue con /bin/sh. Inoltre se apro una shell
sh ed eseguo uno script bash (con #!/bin/bash inserito nella prima riga)
o lancio lo stesso script con il comando con sh -c, in entrambi casi
viene utilizzato l'interprete bash.

In genere /bin/sh è un link ad una delle varie shell. Dovresti controllare
qual è e verificare che quell'interprete gestisca correttamente lo shebang.
(Nell'ipotesi che la shell si occupi dell'interpretazione dello shebang
anziché farlo fare alla chiamata «execve» del kernel.)


ecco come si chiama, shebang, non riuscivo a ricordarlo! Bene, grazie.

Comunque sia che si lanci lo script da shell at, con il comando at -f, 
direttamente da shell sh o con il comando sh -c, viene utilizzata sempre 
la stessa shell /bin/sh indipendentemente a cosa quel link simbolico 
punti quindi mi aspetto abbia sempre lo stesso comportamento invece at 
-f non legge lo shebang. Un workaround comunque me lo hai suggerito, mi 
accontento,


Probabilmente chiamare at con il parametro -f farà direttamente una 
chiamata «execve» (che non so cosa sia ma riporto quel che hai scritto 
tu) al kernel che mi sembra di aver capito non va a leggere la shebang 
dello script... quindi non si potranno nemmeno chiamare script in altri 
linguaggi (php, python etc...). Magari poi approfondisco.


Grazie!

Piviul



Re: bash in at command

2022-10-05 Per discussione Giuseppe Sacco
Il giorno mer, 05/10/2022 alle 14.36 +0200, Piviul ha scritto:
> On 05/10/22 12:15, Giuseppe Sacco wrote:
> > [...]
> > Qualcosa del tipo:
> > $ echo "bash -c /path/completo/script" | at 06:15
> 
> in effetti così funziona però il comportamento mi sembra abbastanza 
> strano... da shell at legge l'interprete da utilizzare dal file stesso 
> mentre con l'opzione -f lo esegue con /bin/sh. Inoltre se apro una shell 
> sh ed eseguo uno script bash (con #!/bin/bash inserito nella prima riga) 
> o lancio lo stesso script con il comando con sh -c, in entrambi casi 
> viene utilizzato l'interprete bash.

In genere /bin/sh è un link ad una delle varie shell. Dovresti controllare
qual è e verificare che quell'interprete gestisca correttamente lo shebang.
(Nell'ipotesi che la shell si occupi dell'interpretazione dello shebang
anziché farlo fare alla chiamata «execve» del kernel.)

Ciao,
Giuseppe




Re: bash in at command

2022-10-05 Per discussione Piviul

On 05/10/22 12:15, Giuseppe Sacco wrote:

Ciao,

Il giorno lun, 03/10/2022 alle 12.10 +0200, Piviul ha scritto:

Ciao a tutti, c'è un modo impostare l'esecuzione automatica di un bash
script usando atd? Quando lo imposto viene usato sh ma io vorrei proprio
usare bash

Qualcosa del tipo:
$ echo "bash -c /path/completo/script" | at 06:15


in effetti così funziona però il comportamento mi sembra abbastanza 
strano... da shell at legge l'interprete da utilizzare dal file stesso 
mentre con l'opzione -f lo esegue con /bin/sh. Inoltre se apro una shell 
sh ed eseguo uno script bash (con #!/bin/bash inserito nella prima riga) 
o lancio lo stesso script con il comando con sh -c, in entrambi casi 
viene utilizzato l'interprete bash.


bah...

Grazie mille

Piviul



Re: bash in at command

2022-10-05 Per discussione Giuseppe Sacco
Ciao,

Il giorno lun, 03/10/2022 alle 12.10 +0200, Piviul ha scritto:
> Ciao a tutti, c'è un modo impostare l'esecuzione automatica di un bash 
> script usando atd? Quando lo imposto viene usato sh ma io vorrei proprio 
> usare bash

Qualcosa del tipo:
$ echo "bash -c /path/completo/script" | at 06:15

Ciao,
Giuseppe



Re: bash in at command

2022-10-04 Per discussione Paolo Redælli



Il 04/10/22 15:00, Alessandro Rubini ha scritto:


Ma non parliamo troppo di questi strumenti, che poi ci si accorge che
esistono e vengono rotti. Come fgrep: sara` rimosso da una prossima
versione di grep, perche` "grep -F" fa la stessa cosa. Cosi` un tot
di vecchi script si romperanno, per risparmiare un inode e 28 byte in
sistemi peni di gigabyte dimm


"Se vogliamo che tutto rimanga come è bisogna che tutto cambi."

Il Gattopardo

Pare non essere un difetto solo italico.

Per dirla tutta systemd ha reso "automagiche" un sacco di cose che poi 
si scoprono "comodose", (il primo esempio sciocco che mi viene in mente 
è " journalctl --vacuuum-size 500Mb"), a prezzo di rompere con molti 
principi base di Unix ossia "tutto è un file", "il testo è 
un'interfaccia universale" e soprattutto "un programma deve fare una 
cosa sola e farla bene".


Sono però troppo ignorante in materia per avere un'idea informata sulla 
cosa... :(




Re: bash in at command

2022-10-04 Per discussione Piviul

On 04/10/22 15:00, Alessandro Rubini wrote:

Infatti se hai voglia di fare alcune prove ti accorgerai che se scheduli
ad esempio lo script che ho mandato[¹] da shell at (senza specificare
l'opzione -f di at per intenderci) non da errori, se lo scheduli con il
comando -f da errore. In entrambi i casi viene generato il warning
"commands will be executed using /bin/sh".

Preferisco il caso semplice, non "errore o non errore". Faccio "ps u $$"
per vedere che processo sta girando.  Con "at" interattivo parte sh,
che ignora #!/bin/bash come commento:

laptopo% tty
/dev/pts/10

laptopo% at now; sleep 2
warning: commands will be executed using /bin/sh
at> #!/bin/bash
at> ps u $$ > /dev/pts/10
at> 
job 6 at Tue Oct  4 14:50:00 2022
USER   PID %CPU %MEMVSZ   RSS TTY  STAT START   TIME COMMAND
rubini   14462  0.0  0.0   2420   528 ?SN   14:50   0:00 sh

Quindi gira sh. "sleep 2" l'ho messo per non avere il prompt in mezzo.
Con "-f" il risultato e` lo stesso:

laptopo% cat > /tmp/at
#!/bin/bash
ps u $$ > /dev/pts/10


Ciao Alessandro, secondo me hai semplificato un po' troppo. Dalla shell 
at dovresti eseguire lo script /tmp/at non i comandi contenuti nello 
script e se tutto andrà come credo dovrebbe mostrarti lo script /tmp/at 
che ha come interprete bash... altrimenti non si spiegano le prove fatte 
con il metodo di "errore o non errore".


Piviul



Re: bash in at command

2022-10-04 Per discussione Alessandro Rubini
> Infatti se hai voglia di fare alcune prove ti accorgerai che se scheduli 
> ad esempio lo script che ho mandato[¹] da shell at (senza specificare 
> l'opzione -f di at per intenderci) non da errori, se lo scheduli con il 
> comando -f da errore. In entrambi i casi viene generato il warning 
> "commands will be executed using /bin/sh".

Preferisco il caso semplice, non "errore o non errore". Faccio "ps u $$"
per vedere che processo sta girando.  Con "at" interattivo parte sh,
che ignora #!/bin/bash come commento:

   laptopo% tty
   /dev/pts/10

   laptopo% at now; sleep 2
   warning: commands will be executed using /bin/sh
   at> #!/bin/bash
   at> ps u $$ > /dev/pts/10
   at> 
   job 6 at Tue Oct  4 14:50:00 2022
   USER   PID %CPU %MEMVSZ   RSS TTY  STAT START   TIME COMMAND
   rubini   14462  0.0  0.0   2420   528 ?SN   14:50   0:00 sh

Quindi gira sh. "sleep 2" l'ho messo per non avere il prompt in mezzo.
Con "-f" il risultato e` lo stesso:

   laptopo% cat > /tmp/at
   #!/bin/bash
   ps u $$ > /dev/pts/10

   laptopo% at now -f /tmp/at; sleep 2
   warning: commands will be executed using /bin/sh
   job 7 at Tue Oct  4 14:52:00 2022
   USER   PID %CPU %MEMVSZ   RSS TTY  STAT START   TIME COMMAND
   rubini   14469  0.0  0.0   2420   524 ?SN   14:52   0:00 sh

Gira sh. Il programma, se eseguito, va con bash. Ma "-f" usa un file
invece di leggere da stdin, e quello che legge lo manda a sh.

   laptopo% chmod +x /tmp/at

   laptopo% /tmp/at
   USER   PID %CPU %MEMVSZ   RSS TTY  STAT START   TIME COMMAND
   rubini   14475  0.0  0.0   3756  2804 pts/10   S+   14:54   0:00 /bin/bash 
/tmp/

   laptopo% at now; sleep 2
   warning: commands will be executed using /bin/sh
   at> /tmp/at
   at> 
   job 8 at Tue Oct  4 14:54:00 2022
   USER   PID %CPU %MEMVSZ   RSS TTY  STAT START   TIME COMMAND
   rubini   14481  0.0  0.0   3836  2932 ?SN   14:54   0:00 /bin/bash 
/tmp/

man bash:

   [...] For  both  at  and  batch, commands are read from standard input 
or the
   file specified with the -f option and executed. [...]

   -f file Reads the job from file rather than standard input.

Ma non parliamo troppo di questi strumenti, che poi ci si accorge che
esistono e vengono rotti. Come fgrep: sara` rimosso da una prossima
versione di grep, perche` "grep -F" fa la stessa cosa. Cosi` un tot
di vecchi script si romperanno, per risparmiare un inode e 28 byte in
sistemi peni di gigabyte dimm



Re: bash in at command

2022-10-04 Per discussione Piviul

On 04/10/22 11:02, Alessandro Rubini wrote:

In effetti parzialmente hai ragione anche tu; dalla mia esperienza se
usi la modalita` interattiva di at

"at", da specifica, esegue il suo stdin usando sh. Ovviamente
non puo` essere diversamente, perche` romperebbe molte cose.
E lo dice pure su stderr:

laptopo% at now
warning: commands will be executed using /bin/sh


per schedulare un job funziona, viene
letto il commento iniziale #!/bin/bash ma se invece lo scheduli da
script con l'opzione -f non funziona.

non cambia. Semplicemente legge il file invece di leggere stdin.


Grazie Alessandro ma non mi hai ancora convinto ;)

Infatti se hai voglia di fare alcune prove ti accorgerai che se scheduli 
ad esempio lo script che ho mandato[¹] da shell at (senza specificare 
l'opzione -f di at per intenderci) non da errori, se lo scheduli con il 
comando -f da errore. In entrambi i casi viene generato il warning 
"commands will be executed using /bin/sh".


Oramai ho cambiato "programma" in altre parole non ne ho più necessità, 
però se qualcuno avesse una spiegazione...


Grazie!

Piviul

[¹] Lo riporto anche qui per comodità:

$ cat /usr/local/bin/bashtest.sh
#!/bin/bash

set -o errexit

function bashtest
{
    echo ok
}
bashtest



Re: bash in at command

2022-10-04 Per discussione Piviul

On 03/10/22 17:03, Giancarlo Martini wrote:

allora forse /bin/bash è un link a sh

ls -l /bin/bash
-rwxr-xr-x 1 root root 1168776 apr 18  2019 /bin/bash


Piviul



Re: bash in at command

2022-10-04 Per discussione Bertorello, Marco



Il 04/10/2022 11:02, Alessandro Rubini ha scritto:

Quindi at esiste ancora? Incredibile. Niente systemd-at? Non ditelo in
giro...


in effetti è strano, su Debian GNU/SystemD

:D

--
Marco Bertorello
https://www.marcobertorello.it



Re: bash in at command

2022-10-04 Per discussione Federico Di Gregorio

On 04/10/22 11:02, Alessandro Rubini wrote:
[snip]

Quindi at esiste ancora? Incredibile. Niente systemd-at? Non ditelo in
giro...


systemd-run ...

/me hides...

federico




Re: bash in at command

2022-10-04 Per discussione Alessandro Rubini
> In effetti parzialmente hai ragione anche tu; dalla mia esperienza se 
> usi la modalita` interattiva di at

"at", da specifica, esegue il suo stdin usando sh. Ovviamente
non puo` essere diversamente, perche` romperebbe molte cose.
E lo dice pure su stderr:

   laptopo% at now
   warning: commands will be executed using /bin/sh

> per schedulare un job funziona, viene 
> letto il commento iniziale #!/bin/bash ma se invece lo scheduli da 
> script con l'opzione -f non funziona.

non cambia. Semplicemente legge il file invece di leggere stdin.

> Purtroppo non credo sia possibile che uno script sappia quale sia 
> l'interprete che lo sta eseguendo

  ps u $$

Ma anche il C (o il python) non posso eseguirlo direttamente da "at".
La soluzione e` la stessa: dire a /bin/sh di eseguire un file esterno.
Che sara` eseguibile e in questo caso conterra` "#!/bin/bash".

Quindi at esiste ancora? Incredibile. Niente systemd-at? Non ditelo in
giro...



Re: bash in at command

2022-10-04 Per discussione Piviul

On 04/10/22 09:16, Gabriele Zappi wrote:
Non vorrei allora che l'installazione di bash nel tuo ambiente non 
fosse completa, e quindi /bin/bash si traduca in un link simbolico a 
sh ...
Proverei a fare un sudo apt -y --reinstall install bash, nel dubbio, e 
poi riproverei.


Ciao Gabriele, grazie no, sei fuori strada... ma forse ti ho portato 
fuori io... :)


In effetti parzialmente hai ragione anche tu; dalla mia esperienza se 
usi la modalità interattiva di at per schedulare un job funziona, viene 
letto il commento iniziale #!/bin/bash ma se invece lo scheduli da 
script con l'opzione -f non funziona.


Purtroppo non credo sia possibile che uno script sappia quale sia 
l'interprete che lo sta eseguendo però empiricamente fai una prova con 
questo banalissimo script:



$ cat /usr/local/bin/bashtest.sh
#!/bin/bash

set -o errexit

function bashtest
{
    echo ok
}

bashtest


e prova schedularlo con qualcosa tipo:

$ at now -f /usr/local/bin/bashtest.sh

Vedrai che ritorna un errore.

In effetti non mi ero accorto di questo diverso comportamento di at...

Grazie

Piviul



Re: bash in at command

2022-10-04 Per discussione Gabriele Zappi
Non vorrei allora che l'installazione di bash nel tuo ambiente non fosse
completa, e quindi /bin/bash si traduca in un link simbolico a sh ...
Proverei a fare un sudo apt -y --reinstall install bash, nel dubbio, e poi
riproverei.

Buona giornata,

[image: Mailtrack]

Sender
notified by
Mailtrack

04/10/22,
09:13:51
Remove

Il giorno lun 3 ott 2022 alle ore 16:45 Piviul  ha
scritto:

> On 03/10/22 14:19, Gabriele Zappi wrote:
>
> Hai provato mettendo:
>
> #!/bin/bash
>
> In testa allo script?
>
> certo, c'è sempre stato!
>
> Piviul
>


-- 

Best regards,

*Gabriele Zappi*
*http://www.gabrielezappi.net *
GNU/Linux user #380098


Re: bash in at command

2022-10-03 Per discussione Giancarlo Martini
allora forse /bin/bash è un link a sh

Il giorno lun 3 ott 2022 alle ore 16:45 Piviul  ha
scritto:

> On 03/10/22 14:19, Gabriele Zappi wrote:
>
> Hai provato mettendo:
>
> #!/bin/bash
>
> In testa allo script?
>
> certo, c'è sempre stato!
>
> Piviul
>


-- 
Giancarlo Martini
(Replace 'AAA' con '@')
mailto:giancarlo.firAAAgmail.com 


Re: bash in at command

2022-10-03 Per discussione Piviul

On 03/10/22 14:19, Gabriele Zappi wrote:

Hai provato mettendo:

#!/bin/bash

In testa allo script?


certo, c'è sempre stato!

Piviul


Re: bash in at command

2022-10-03 Per discussione Gabriele Zappi
Hai provato mettendo:

#!/bin/bash

In testa allo script?

[image: Mailtrack]

Sender
notified by
Mailtrack

03/10/22,
14:18:26
Remove

Il giorno lun 3 ott 2022 alle ore 12:35 Piviul  ha
scritto:

> Ciao a tutti, c'è un modo impostare l'esecuzione automatica di un bash
> script usando atd? Quando lo imposto viene usato sh ma io vorrei proprio
> usare bash
>
> Grazie
>
>

-- 

Best regards,

*Gabriele Zappi*
*http://www.gabrielezappi.net *
GNU/Linux user #380098


Re: bash in at command

2022-10-03 Per discussione Giancarlo Martini
Non basta mettere il percorso assoluto nella prima riga dopo #!

--
Giancarlo Martini
http://www.giancarlomartini.it
http://www.linkedin.com/in/giancarlo-martini

Il lun 3 ott 2022, 12:35 Piviul  ha scritto:

> Ciao a tutti, c'è un modo impostare l'esecuzione automatica di un bash
> script usando atd? Quando lo imposto viene usato sh ma io vorrei proprio
> usare bash
>
> Grazie
>
>


bash in at command

2022-10-03 Per discussione Piviul
Ciao a tutti, c'è un modo impostare l'esecuzione automatica di un bash 
script usando atd? Quando lo imposto viene usato sh ma io vorrei proprio 
usare bash


Grazie