SIGINT sinyalini yakalamaya çalışırken neden bir hata mesajı alıyorum?


12

Lftp kullanarak bir sunucudan dosyaları otomatik olarak indirmek için aşağıdaki komut dosyasını çalıştırıyorum. Çalıştığı zaman hata mesajını aldığım dışında çalışır

trap: SIGINT: bad trap

SIGINT ve SIGTERM'i INT ve TERM ile değiştirirsem işe yarıyor, ancak aynı amaca ulaşıp ulaşmadığını bilmiyorum. Bu Linux Debian 4.9.2-10'da.

#!/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
Bu kod hangi kullanıcı olarak çalışır? Birisi yaramaz ln -s /etc/passwd /tmp/$base_name.lockveya eşdeğeri yaratırsa ne olur ?
thrig

Yanıtlar:


16

SIGÖneki bırakın , sadece sinyal adını girin:

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

Tüm mermiler SIGöneki ile girdiyi anlamıyor / almıyor, sh(muhtemelen kullanıyorsunuz dash) bunlardan biri.

Gibi diğer taraftan, daha zengin kabukları özelliği ksh, bash, zshizin SIGsinyal adının önünde önek.


Teşekkür ederim! Ben denedim bu; Sadece aynı şeyi yaptığından emin olmak istedim.
flyingace

@flyingace yerine #!satırınızı referans olarak değiştirmeyi de düşünebilirsiniz . bashsh
roaima

Kullanıyor dash, ha? Daha önce o kabuğu duymadım ...
SeldomNeedy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.