Tại sao tôi nhận được thông báo lỗi khi cố gắng bẫy tín hiệu SIGINT?


12

Tôi đang chạy đoạn script bên dưới để tự động tải xuống các tệp từ máy chủ bằng lftp. Nó hoạt động ngoại trừ khi nó chạy tôi nhận được thông báo lỗi

trap: SIGINT: bad trap

Nếu tôi thay thế SIGINT và SIGTERM bằng INT và TERM thì nó vẫn hoạt động, nhưng tôi không biết liệu nó có đạt được mục đích tương tự không. Đây là trên 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
Mã người dùng này chạy như thế nào? Điều gì xảy ra nếu ai đó nghịch ngợm tạo ra ln -s /etc/passwd /tmp/$base_name.lockhoặc tương đương?
18 giờ 49

Câu trả lời:


16

Bỏ SIGtiền tố, chỉ cần nhập tên tín hiệu:

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

Không phải tất cả các shell đều hiểu / lấy đầu vào với SIGtiền tố, sh(có lẽ bạn đang sử dụng dash) là một trong số đó.

Mặt khác, nhiều tính năng phong phú như vỏ ksh, bash, zshcho phép SIGtiền tố ở phía trước của tên tín hiệu.


Cảm ơn bạn! đó là những gì tôi đã cố gắng; Tôi chỉ muốn chắc chắn rằng nó đã làm điều tương tự.
flyace

@fellingace bạn cũng có thể xem xét thay đổi #!dòng của mình thành tham chiếu bashthay vì sh.
roaima

Sử dụng dashhả? Tôi chưa từng nghe về cái vỏ đó trước đây ...
SeldomNeedy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.