Warum erhalte ich eine Fehlermeldung, wenn ich versuche, ein SIGINT-Signal abzufangen?

12

Ich führe das folgende Skript aus, um mit lftp automatisch Dateien von einem Server herunterzuladen. Es funktioniert nur, wenn es läuft, erhalte ich die Fehlermeldung

trap: SIGINT: bad trap

Wenn ich SIGINT und SIGTERM durch INT und TERM ersetze, funktioniert es, aber ich weiß nicht, ob es dann den gleichen Zweck erfüllt. Dies ist unter 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
flyingace
quelle
1
Unter welchem ​​Benutzer wird dieser Code ausgeführt? Was passiert, wenn jemand ungezogen schafft ln -s /etc/passwd /tmp/$base_name.lockoder gleichwertig?
Thrig

Antworten:

16

Löschen Sie das SIGPräfix, geben Sie einfach den Signalnamen ein:

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

Nicht alle Shells verstehen die Eingabe mit dem SIGPräfix sh(vermutlich verwenden Sie dash).

Auf der anderen Seite verfügt reiche Shells wie ksh, bash, zsherlaubenSIG Präfix vor dem Signalnamen.

heemayl
quelle
Vielen Dank! das habe ich versucht; Ich wollte nur sicherstellen, dass es dasselbe tut.
Flyingace
@flyingace Sie könnten auch erwägen Ihre wechselnden #!Linie Referenz bashstatt sh.
Roaima
Verwenden dash, nicht wahr? Ich habe noch nie von dieser Shell gehört ...
SeldomNeedy