Чому я отримую повідомлення про помилку при спробі захоплення сигналу 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

1
Як користувач працює цей код? Що станеться, якщо хтось неслухняний творить ln -s /etc/passwd /tmp/$base_name.lockабо еквівалент?
триг

Відповіді:


16

Відкиньте SIGпрефікс, просто введіть ім'я сигналу:

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

Не всі оболонки розуміють / приймають введення з SIGпрефіксом sh(імовірно, ви використовуєте dash) є одним із таких.

З іншого боку, більш функціональні оболонки, як ksh, наприклад bash, zshдозволяють SIGпрефікс перед назвою сигналу.


Дякую! це те, що я спробував; Я просто хотів переконатися, що це зробило те саме.
flyingace

@flyingace ви також можете розглянути можливість змінити #!лінію на посилання bashзамість sh.
roaima

Використовуєш dash, так? Я раніше не чув про цю оболонку ...
SeldomNeedy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.