Shell de script obtém id e mata processo

Shell de script obtém id e mata processo

Por favor, não consigo encontrar o erro no meu 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'"

Eu tenho este erro:

awk: line 2: missing } near end of file

Você tem uma ideia?

Responder1

Para este tipo de problemas, geralmente é melhor começar pordividindo-o em suas partes constituintes.Comece com a expressão mais interna, que parece ter como objetivo obter todos os PIDs para myprocesssinalizá-los, e vá avançando, testando cada etapa ao longo do caminho para ter certeza de que fornece o resultado esperado.

Você está fazendo isso pegando a saída de ps, grepping para o processo, executando a saída awkpara extrair o PID relevante e, em seguida, passando-o para xargs. Ao olhar para o que você é realmentetentando realizarem vez do problema específico que você está enfrentando, posso dizer quehá pelo menos duas maneiras muito melhores de fazer isso,o que também coincidentemente evita totalmente o problema que você está enfrentando (que se baseia em ter várias camadas de citações em um único comando composto).


Uma é manter pse usar seus parâmetros -Ce -opara obter apenas as informações nas quais você está interessado. Na verdade, isso é mencionado como exemplo na página de manual do ps(1). Você iria então querer:

ps -C myprocess -o pid=

que imprimirá apenas o(s) PID(s) de quaisquer processos com o nome da imagem myprocess. Isso pode então ser canalizado trivialmente para xargs, substituindo your ps ... | xargs killpor:

ps -C myprocess -o pid= | xargs kill

ou possivelmente usando a substituição de processo para evitar completamente o pipe e o xargs:

kill $( ps -C myprocess -o pid= )

Oalternativa ainda melhoré usado killallpara sinalizar diretamente todos os processos com um determinado nome de imagem:

killall -e myprocess

Aqui, -eespecifica o modo "exato", no qual os nomes das imagens do processo correspondem exatamente. Neste caso, substitua-o ps ... | xargs killinteiramente pelo acima.


-o UserKnownHostsFile=/dev/nul

Ah, e o nome convencional é /dev/null, não /dev/nul. NULé o CP/M-ismo de meados da década de 1970, transportado pela Microsoft para as versões atuais do Windows. Neste caso específico, o efeito pode ou não ser o mesmo, dependendo de quão rigoroso sshé o seu.

informação relacionada