Ответ 1
alias kill3000="fuser -k -n tcp 3000"
Я хочу определить псевдоним bash с именем kill3000
для автоматизации следующей задачи:
$ lsof -i:3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 13402 zero 4u IPv4 2847851 0t0 TCP *:3000 (LISTEN)
$ kill -9 13402
alias kill3000="fuser -k -n tcp 3000"
Попробуйте следующее:
kill -9 $(lsof -i:3000 -t)
Флаг -t - это то, что вы хотите: оно отображает PID и ничего больше.
Если процесс не найден, и вы не хотите видеть сообщение об ошибке:
kill -9 $(lsof -i:3000 -t) 2> /dev/null
Предполагая, что вы используете bash.
Предложение Basile превосходно: сначала нужно попытаться завершить процесс, как правило, будет убивать -TERM, если это не удастся, тогда kill -KILL (AKA kill -9):
pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid
Возможно, вы захотите сделать это bash.
Другой вариант, используя исходную команду lsof
:
lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9
Если вы хотите использовать это в оболочке script, вы можете добавить флаг -r
в xargs
, чтобы обрабатывать случай, когда процесс не прослушивается:
... | xargs -r kill -9
fuser -n tcp 3000
Выдает вывод
3000/tcp: <$pid>
Итак, вы можете сделать:
fuser -n tcp 3000 | awk '{ print $2 }' | xargs -r kill
Как насчет
alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9"
fuser -k 3000/tcp
также должен работать