Mengapa saya mendapatkan pesan kesalahan saat mencoba menjebak sinyal SIGINT?

12

Saya menjalankan skrip di bawah ini untuk secara otomatis mengunduh file dari server menggunakan lftp. Ini berfungsi kecuali bahwa ketika dijalankan saya mendapatkan pesan kesalahan

trap: SIGINT: bad trap

Jika saya mengganti SIGINT dan SIGTERM dengan INT dan JANGKA kemudian itu berfungsi, tapi saya tidak tahu apakah itu kemudian mencapai tujuan yang sama. Ini ada di 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
sumber
1
Pengguna apa yang dijalankan oleh kode ini? Apa yang terjadi jika seseorang yang nakal menciptakan ln -s /etc/passwd /tmp/$base_name.lockatau setara?
thrig

Jawaban:

16

Jatuhkan SIGawalan, cukup masukkan nama sinyal:

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

Tidak semua shell mengerti / mengambil input dengan SIGawalan, sh(mungkin Anda gunakan dash) adalah salah satunya.

Di sisi lain, lebih fitur kerang kaya seperti ksh, bash, zshmemungkinkan SIGawalan di depan nama sinyal.

heemayl
sumber
Terima kasih! itulah yang saya coba; Saya hanya ingin memastikan itu melakukan hal yang sama.
flyingace
@flyingace Anda juga dapat mempertimbangkan mengubah Anda #!line untuk referensi bashbukan sh.
roaima
Menggunakan dash, ya? Saya belum pernah mendengar cangkang itu sebelumnya ...
SeldomNeedy