Quiero ejecutar un script bash simple (denominado killprocess.sh a continuación) para eliminar un proceso/servicio particular que se ejecuta en un puerto particular (por ejemplo, 8080) en una máquina remota donde ambos tienen el sistema operativo Ubuntu 18.04.1 LTS.
Establecí una conexión a través de ssh (openssh) de la siguiente manera para ejecutar el script. La conexión también se establece correctamente.
sshpass -p "password" ssh -n [email protected] -f "/bin/bash /home/killprocess.sh"
El contenido de killprocess.sh se proporciona a continuación.
processID=$(lsof -t -i:8080)
echo $processID
kill $processID
Aunque imprime correctamente el ID del proceso en la consola, aparece un mensaje de error a continuación que implica que no es posible finalizarlo.
: los argumentos deben ser ID de proceso o trabajo
Respuesta1
Ejecute el fromdos killprocess.sh
comando para que su script funcione (está incluido en el tofrodos
paquete).
He aquí por qué.
El mensaje de error sugiere que ha escrito su secuencia de comandos en un editor de texto de Windows, que maneja los finales de línea de manera diferente (agregándolos \r\n
al final de la línea en lugar de solo \n
). El mensaje de error es sospechoso porque debería ser algo como
bash: kill: meh: arguments must be process or job IDs
Generaría una línea como la que mencionaste solo si el argumento del kill
comando contuviera un \r
carácter (retorno de carro). Entonces, cuando se imprime el mensaje de error, antes de los terceros dos puntos, el cursor vuelve al principio de la línea y el resto del mensaje de error sobrescribe todo lo que se imprimió hasta ese momento. Esto también explica por qué el kill
comando se quejó: recibió algo como 1234\r
, que no puede ser un ID de proceso.
Lo más probable es que esto se deba a que la primera línea de su script en realidad es
processID=$(lsof -t -i:8080)\r
pero no puedes ver el \r
personaje, por supuesto, ya que no se imprime. No puede verlo en la salida de la segunda línea, ya que genera la línea, el cursor vuelve al principio, pero luego el carácter de nueva línea hace que el cursor vaya a la siguiente línea.
Por cierto, siempre se sospecha del problema de final de línea de Unix/Windows si un mensaje de error de bash comienza con dos puntos.