Dlaczego pojawia się komunikat o błędzie podczas próby przechwycenia sygnału SIGINT?


12

Korzystam z poniższego skryptu, aby automatycznie pobierać pliki z serwera za pomocą lftp. Działa poza tym, że po uruchomieniu pojawia się komunikat o błędzie

trap: SIGINT: bad trap

Jeśli zastąpię SIGINT i SIGTERM INT i TERM, to zadziała, ale nie wiem, czy osiągnie ten sam cel. To jest na 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
Jakim użytkownikiem działa ten kod? Co się stanie, jeśli ktoś niegrzeczny stworzy ln -s /etc/passwd /tmp/$base_name.locklub równoważny?
thrig

Odpowiedzi:


16

Upuść SIGprefiks, po prostu wprowadź nazwę sygnału:

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

Nie wszystkie powłoki rozumieją / przyjmują dane wejściowe z SIGprefiksem sh(prawdopodobnie używasz dash) jest jedną z nich.

Z drugiej strony, bardziej funkcjonalny jak muszle ksh, bash, zshpozwalają SIGprefiks przed nazwą sygnału.


Dziękuję Ci! właśnie tego próbowałem; Chciałem tylko upewnić się, że zrobi to samo.
flyingace

@flyingace można również rozważyć zmianę #!linii na odniesienia bashzamiast sh.
roaima,

Używasz dash, co? Nie słyszałem o tej skorupie wcześniej ...
SeldomNeedy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.