Beenden Sie den Remote-Prozess über SSH

Beenden Sie den Remote-Prozess über SSH

Ich habe einen Prozess, den ich aus der Ferne beenden möchte. Ich habe versucht

ssh remotehost "kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')"

aber dies gibt den Fehler zurück

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

Wenn ich den Befehl jedoch innerhalb der Anführungszeichen ausführe

kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')

auf dem Remote-Host funktioniert es einwandfrei. Übersehe ich hier etwas?

Antwort1

Die $(..)Befehlsersetzung würde fehlschlagen, da die $von der lokalen Shell erweitert wird, selbstVores wird an stdinden sshBefehl übergeben. Sie müssen es entweder maskieren oder Here-Strings verwenden.

Außerdem wird der Befehl darin, der awkgedruckt wird, $2als Befehlszeilenargument interpoliert. Daher maskieren wir ihn, um seine Erweiterung aufzuschieben, bis der Befehl remote ausgeführt wird.

Mit der Flucht,

ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"

oder mit here-doc

ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF

Beachten Sie auch, dass dies grep .. | grep .. | awküberflüssig ist. Sie können den gesamten Vorgang awkallein mit ausführen. Oder noch besser, verwenden Sie pkill, um den Prozess direkt über den Namen zu beenden.

Antwort2

Bei mir hat das für eine Reihe von Hosts super funktioniert:

for i in `cat hostlist`;do ssh -q $i kill `ssh -q $i ps -ef | grep <process name>|awk '{print $2}'`;done  

Antwort3

Sie können optional etwas tun wie

ssh remotehost "killall -r 'foo.*bar'"

verwandte Informationen