Proceso de obtención de ID y eliminación del script Shell

Proceso de obtención de ID y eliminación del script Shell

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 myprocessseñ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 awkpara 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 psy usar sus parámetros -Cy -opara 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 killcon:

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á killallpara señalar todos los procesos con un nombre de imagen determinado directamente:

killall -e myprocess

Aquí, -eespecifica el modo "exacto", en el que los nombres de las imágenes de proceso coinciden exactamente. En este caso, reemplace su ps ... | xargs killcompletamente con el anterior.


-o UserKnownHostsFile=/dev/nul

Ah, y el nombre convencional es /dev/null, no /dev/nul. NULes 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 sshseas.

información relacionada