
Por favor, no puedo encontrar el error en mi comando.
ssh -t root@$machine -x "sshpass -p 'ubuntu' ssh -t root@$address -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/nul -x 'ps -ef | grep "myprocess" | awk {print $2} | xargs kill'"
Tengo este error:
awk: line 2: missing } near end of file
Tienes una idea ?
Respuesta1
Para este tipo de problemas, normalmente es mejor empezar pordividiéndolo en sus partes constituyentes.Comience con la expresión más interna, que parece apuntar a obtener todos los PID para myprocess
señalizarlos, y avance hacia afuera, probando cada paso a lo largo del camino para asegurarse de que brinde el resultado esperado.
Para hacer esto, tome la salida de ps
, busque el proceso, ejecute la salida awk
para extraer el PID relevante y luego pase eso a xargs. Al mirar lo que realmente erestratando de lograrEn lugar del problema específico al que te enfrentas, puedo decir quehay al menos dos formas mucho mejores de hacer esto,que casualmente también evitan por completo el problema al que se enfrenta (que se basa en tener varias capas de citas dentro de un único comando compuesto).
Una es conservar ps
y usar sus parámetros -C
y -o
para obtener solo la información que le interesa. Esto se menciona como ejemplo en la página del manual de ps(1). Entonces querrías:
ps -C myprocess -o pid=
que imprimirá solo los PID de cualquier proceso con el nombre de la imagen myprocess
. Luego, esto se puede canalizar trivialmente a xargs, reemplazando your ps ... | xargs kill
con:
ps -C myprocess -o pid= | xargs kill
o posiblemente usar la sustitución de procesos para evitar la tubería y los xargs por completo:
kill $( ps -C myprocess -o pid= )
Elalternativa aún mejorse utilizará killall
para señalar todos los procesos con un nombre de imagen determinado directamente:
killall -e myprocess
Aquí, -e
especifica el modo "exacto", en el que los nombres de las imágenes de proceso coinciden exactamente. En este caso, reemplace su ps ... | xargs kill
completamente con el anterior.
-o UserKnownHostsFile=/dev/nul
Ah, y el nombre convencional es /dev/null, no /dev/nul. NUL
es el CP/M-ismo de mediados de la década de 1970, trasladado por Microsoft a las versiones actuales de Windows. En este caso particular, el efecto puede ser el mismo o no, dependiendo de lo estricto que ssh
seas.