
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 myprocess
sinalizá-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 awk
para 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 ps
e usar seus parâmetros -C
e -o
para 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 kill
por:
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 killall
para sinalizar diretamente todos os processos com um determinado nome de imagem:
killall -e myprocess
Aqui, -e
especifica o modo "exato", no qual os nomes das imagens do processo correspondem exatamente. Neste caso, substitua-o ps ... | xargs kill
inteiramente 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.