
Bitte, ich kann den Fehler in meinem Befehl nicht finden.
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'"
Ich habe diesen Fehler:
awk: line 2: missing } near end of file
Haben Sie eine Idee?
Antwort1
Bei dieser Art von Problemen ist es normalerweise am besten, mitindem man es in seine Bestandteile zerlegt.Beginnen Sie mit dem innersten Ausdruck, dessen Ziel darin besteht, alle PIDs abzurufen, um myprocess
sie zu signalisieren, und arbeiten Sie sich nach außen vor. Testen Sie dabei jeden Schritt, um sicherzustellen, dass die erwartete Ausgabe erzielt wird.
Sie tun dies, indem Sie die Ausgabe von nehmen ps
, nach dem Prozess suchen, die Ausgabe durchlaufen lassen, awk
um die relevante PID zu extrahieren, und diese dann an xargs übergeben. Indem Sie sich ansehen, was Sie tatsächlichversuchen zu erreichenanstatt des spezifischen Problems, mit dem Sie konfrontiert sind, kann ich sagen, dassEs gibt mindestens zwei viel bessere Möglichkeiten, dies zu tun,wodurch nebenbei auch das von Ihnen angesprochene Problem (das auf mehreren Anführungszeichenebenen innerhalb eines einzigen zusammengesetzten Befehls beruht) vollständig vermieden wird.
Eine Möglichkeit besteht darin, die beizubehalten ps
und ihre Parameter -C
und zu verwenden -o
, um nur die Informationen zu erhalten, die Sie interessieren. Dies wird tatsächlich als Beispiel in der Manpage von ps(1) erwähnt. Sie benötigen dann:
ps -C myprocess -o pid=
Dadurch werden nur die PIDs aller Prozesse mit dem Imagenamen gedruckt myprocess
. Dies kann dann trivial in xargs weitergeleitet werden, wobei Ihr ps ... | xargs kill
durch Folgendes ersetzt wird:
ps -C myprocess -o pid= | xargs kill
oder möglicherweise durch Prozesssubstitution, um die Pipe und Xargs vollständig zu vermeiden:
kill $( ps -C myprocess -o pid= )
Dernoch bessere Alternativeist zu verwenden, killall
um allen Prozessen mit einem bestimmten Image-Namen direkt zu signalisieren:
killall -e myprocess
Hier -e
wird der „exakte“ Modus angegeben, in dem Prozessabbildnamen exakt übereinstimmen müssen. Ersetzen Sie in diesem Fall Ihr ps ... | xargs kill
vollständig durch das Obige.
-o UserKnownHostsFile=/dev/nul
Oh, und der herkömmliche Name ist /dev/null, nicht /dev/nul. NUL
ist CP/M-ismus aus der Mitte der 1970er Jahre, der von Microsoft in aktuelle Windows-Versionen übernommen wurde. In diesem speziellen Fall kann der Effekt derselbe sein oder auch nicht, je nachdem, wie streng Sie ssh
sind.