Почему я получаю сообщение об ошибке при попытке перехвата сигнала SIGINT?

12

Я запускаю приведенный ниже скрипт для автоматической загрузки файлов с сервера с использованием lftp. Это работает за исключением того, что при запуске я получаю сообщение об ошибке

trap: SIGINT: bad trap

Если я заменю SIGINT и SIGTERM на INT и TERM, то это сработает, но я не знаю, достигнет ли оно тогда той же цели. Это на 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
источник
1
Какой пользователь запускает этот код? Что произойдет, если кто-то создаст непослушного ln -s /etc/passwd /tmp/$base_name.lockили эквивалентного?
thrig

Ответы:

16

Удалите SIGпрефикс, просто введите имя сигнала:

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

Не все оболочки понимают / принимают ввод с SIGпрефиксом sh(предположительно, вы используете dash) - один из них.

С другой стороны, более богатые возможностей оболочки , как ksh, bash, zshпозволяет SIGпрефикс перед именем сигнала.

heemayl
источник
Спасибо! это то, что я пытался; Я просто хотел убедиться, что он сделал то же самое.
flyingace
@flyingace вы могли бы также рассмотреть возможность изменения вашей #!строки для ссылки bashвместо sh.
Ройма
Используете dash, а? Я не слышал об этой скорлупе раньше ...
SeldomNeedy