¿Por qué recibo un mensaje de error cuando intento atrapar una señal SIGINT?


12

Estoy ejecutando el siguiente script para descargar automáticamente archivos de un servidor usando lftp. Funciona, excepto que cuando se ejecuta recibo el mensaje de error

trap: SIGINT: bad trap

Si reemplazo SIGINT y SIGTERM con INT y TERM, entonces funciona, pero no sé si logra el mismo propósito. Esto está en 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
¿A qué usuario se ejecuta este código? ¿Qué pasa si alguien travieso crea ln -s /etc/passwd /tmp/$base_name.locko equivalente?
thrig

Respuestas:


16

Suelta el SIGprefijo, solo ingresa el nombre de la señal:

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

No todos los shells entienden / toman la entrada con el SIGprefijo, sh(presumiblemente está usando dash) es uno de esos.

Por otro lado, cuentan con más conchas ricas como ksh, bash, zshpermitir que SIGel prefijo delante del nombre de la señal.


¡Gracias! eso es lo que probé; Solo quería asegurarme de que hiciera lo mismo.
Flyingace

@flyingace también podría considerar cambiar su #!línea a referencia en bashlugar de sh.
roaima

Usando dash, ¿eh? No he oído hablar de ese caparazón antes ...
SeldomNeedy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.