Skript-Shell ruft ID ab und beendet Prozess

Skript-Shell ruft ID ab und beendet Prozess

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 myprocesssie 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, awkum 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 psund ihre Parameter -Cund 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 killdurch 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, killallum allen Prozessen mit einem bestimmten Image-Namen direkt zu signalisieren:

killall -e myprocess

Hier -ewird der „exakte“ Modus angegeben, in dem Prozessabbildnamen exakt übereinstimmen müssen. Ersetzen Sie in diesem Fall Ihr ps ... | xargs killvollständig durch das Obige.


-o UserKnownHostsFile=/dev/nul

Oh, und der herkömmliche Name ist /dev/null, nicht /dev/nul. NUList 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 sshsind.

verwandte Informationen