Perché viene visualizzato un messaggio di errore quando si tenta di intercettare un segnale SIGINT?


12

Sto eseguendo lo script di seguito per scaricare automaticamente i file da un server utilizzando lftp. Funziona tranne che quando funziona ottengo il messaggio di errore

trap: SIGINT: bad trap

Se sostituisco SIGINT e SIGTERM con INT e TERM, allora funziona, ma non so se raggiungerà lo stesso scopo. Questo è su Linux Debian 4.9.2-10.

#!/bin/sh
login="login"
pass="password"
host="server.server.com"
remote_dir='~/remote/dir'
local_dir="/local/dir"

base_name="$(basename "$0")"
lock_file="/tmp/$base_name.lock"
trap "rm -f $lock_file" SIGINT SIGTERM
if [ -e "$lock_file" ]
then
    echo "$base_name is running already."
    exit
else
    touch "$lock_file"
    /usr/bin/lftp -p 22 -u "$login","$pass" sftp://"$host" << EOF
    set sftp:auto-confirm yes
    set mirror:use-pget-n 5
    mirror -c -P5 "$remote_dir" "$local_dir"
    quit
EOF
    rm -f "$lock_file"
    trap - SIGINT SIGTERM
    exit
fi

1
Con quale utente viene eseguito questo codice? Cosa succede se qualcuno cattivo crea ln -s /etc/passwd /tmp/$base_name.locko equivalente?
thrig

Risposte:


16

Rilascia il SIGprefisso, inserisci semplicemente il nome del segnale:

trap "rm -f -- "$lock_file"" INT TERM

Non tutte le shell capiscono / accettano l'input con il SIGprefisso, sh(presumibilmente si sta usando dash) è uno di quelli.

D'altra parte, più caratterizzato da conchiglie ricchi come ksh, bash, zshconsentire SIGil prefisso davanti al nome del segnale.


Grazie! questo è quello che ho provato; Volevo solo assicurarmi che facesse la stessa cosa.
flyingace,

@flyingace potresti anche considerare di cambiare la tua #!linea in riferimento bashinvece che sh.
roaima,

Usi dash, eh? Non ho mai sentito parlare di quella conchiglia prima ...
SeldomNeedy,
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.