
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 stdin
den ssh
Befehl übergeben. Sie müssen es entweder maskieren oder Here-Strings verwenden.
Außerdem wird der Befehl darin, der awk
gedruckt wird, $2
als 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 awk
allein 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'"