Script bash

di il
6 risposte

Script bash

Ciao a tutti, premetto che è da pochissimo che utilizzo il bash. Ho un problema su uno script (chiamato ese21) che dovrebbe eseguire un ciclo infinito e intercettare i segnali SIGUSR1 e SIGUSR2 ogni decimo di secondo. Quando si riceve il segnale SIGUSR1 lo script dovrebbe stampare a video "ricevuto segnale SIGUSR1", per quanto riguarda il segnale SIGUSR2 dovrebbe comportarsi analogamente. Ho provato a fare il tutto nel seguente modo:

#!/bin/bash
while true; do
	sleep 0.1
	trap echo "ricevuto segnale SIGUSR1" SIGUSR1
	trap echo "ricevuto segnale SIGUSR2" SIGUSR2
done
Dovrei lanciare lo script in background.
Successivamente dovrei testare lo script lanciando i due segnali SIGUSR1 e SIGUSR2 per 10 volte a distanza di 1 secondo e quindi terminare il processo in background. Ho quindi creato il seguente script (chiamato ese22):

#!/bin/bash
#lancio lo script ese21
./ese21.sh &

for ((i=0; i<10; i+=1)); do
	sleep 1
	kill -SIGUSR1 $!;
	kill -SIGUSR2 $!;
done
Ora, quando esegue da terminale ese22 con il comando bash ese22.sh mi dice "permesso negato" e successivamente mi stampa ripetutamente il seguente messaggio

ese22.sh: riga 7: kill: (16693) - Nessun processo corrisponde
ese22.sh: riga 8: kill: (16693) - Nessun processo corrisponde

Qualcuno sa dirmi qual'è il problema ?

Grazie mille!

6 Risposte

  • Re: Script bash

    La prima cosa che devi fare è dare i permessi di esecuzione ai due script:
    
    $ chmod +x ese21.sh
    $ chmod +x ese22.sh
    
    Ora devi modificare il codice perchè non è corretto, esattamente nell'uso del trap.
    Con trap registri un segnale e va registrato solo una volta, la sintassi è

    trap <COMANDO> <SEGNALE>

    quindi sarà

    trap "echo \"messaggio\"" SIG...

    di conseguenza:
    
    #!/bin/bash
    
    trap "echo \"ricevuto segnale SIGUSR1\"" SIGUSR1
    trap "echo \"ricevuto segnale SIGUSR2\"" SIGUSR2
    
    while true; do
       sleep 0.1
    done
    
    il secondo codice è quasi corretto se non che lascia attivo il processo principale che è intelligente fermarlo prima di uscire:
    
    #!/bin/bash
    #lancio lo script ese21
    ./ese21.sh &
    
    cpid="$!"
    echo "run child:$cpid"
    
    for ((i=0; i<5; i+=1)); do
       sleep 1
       kill -SIGUSR1 $!;
       kill -SIGUSR2 $!;
    done
    
    kill -9 $!;
    echo "exit";
    
    visualizziamo anche il pid del processo chiamato in modo da poter controllare che sia effettivamente terminato.
  • Re: Script bash

    vbextreme ha scritto:


    La prima cosa che devi fare è dare i permessi di esecuzione ai due script:
    
    $ chmod +x ese21.sh
    $ chmod +x ese22.sh
    
    Ora devi modificare il codice perchè non è corretto, esattamente nell'uso del trap.
    Con trap registri un segnale e va registrato solo una volta, la sintassi è

    trap <COMANDO> <SEGNALE>

    quindi sarà

    trap "echo \"messaggio\"" SIG...

    di conseguenza:
    
    #!/bin/bash
    
    trap "echo \"ricevuto segnale SIGUSR1\"" SIGUSR1
    trap "echo \"ricevuto segnale SIGUSR2\"" SIGUSR2
    
    while true; do
       sleep 0.1
    done
    
    il secondo codice è quasi corretto se non che lascia attivo il processo principale che è intelligente fermarlo prima di uscire:
    
    #!/bin/bash
    #lancio lo script ese21
    ./ese21.sh &
    
    cpid="$!"
    echo "run child:$cpid"
    
    for ((i=0; i<5; i+=1)); do
       sleep 1
       kill -SIGUSR1 $!;
       kill -SIGUSR2 $!;
    done
    
    kill -9 $!;
    echo "exit";
    
    visualizziamo anche il pid del processo chiamato in modo da poter controllare che sia effettivamente terminato.
    Tante grazie! Ora funziona
  • Re: Script bash

    IL CROSSPOSTING è una tecnica vietata sulla maggioranza dei forum MA SOPRATUTTO IRRISPETTOSO nei confronti di chi ti aiuta.
  • Re: Script bash

    vbextreme ha scritto:


    IL CROSSPOSTING è una tecnica vietata sulla maggioranza dei forum MA SOPRATUTTO IRRISPETTOSO nei confronti di chi ti aiuta.
    Dovendo rispettare certe tempistiche e visto che la risposta tardava ad arrivare, ho scritto quell'altro post prima che qualcuno rispondesse a questo! Quindi non mi sembra di aver mancato di rispetto a NESSUNO!
  • Re: Script bash

    Essere degli zoticoni non è una scusa, poi è risaputo che i tempi dei forum sono lunghi e se hai fretta o vai su una chat quale IRC o paghi qualcuno che ti aiuti
    .
    Leggiti il regolamento e magari cerca in internet le motivazioni del tentativo di sopprimere il CROSSPOSTING.

    Per di più hai ringraziato entrambi ma la soluzione corretta è solo una!
    Rimani nel tuo mondo
  • Re: Script bash

    vbextreme ha scritto:


    Essere degli zoticoni non è una scusa, poi è risaputo che i tempi dei forum sono lunghi e se hai fretta o vai su una chat quale IRC o paghi qualcuno che ti aiuti
    .
    Leggiti il regolamento e magari cerca in internet le motivazioni del tentativo di sopprimere il CROSSPOSTING.

    Per di più hai ringraziato entrambi ma la soluzione corretta è solo una!
    Rimani nel tuo mondo
    :*
Devi accedere o registrarti per scrivere nel forum
6 risposte