Убить все процессы на определенном порту через Jenkins

Я хотел бы иметь работу Jenkins, которая убивает все процессы на порту 5000 (bash). Простое решение

fuser -k 5000/tcp

отлично работает, когда я выполняю эту команду в терминале, но на Jenkins («выполнить оболочку») сборка помечается как сбой.

я тоже пробовал

kill $(lsof -i -t:5000)

но опять же, так как это работает на обычном терминале, на Дженкинсе я получаю

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Build step 'Execute shell' marked build as failure

Любые идеи, как это исправить?


person trina24    schedule 21.06.2017    source источник


Ответы (5)


У меня была такая же проблема. Это не сработало, когда процесс не был запущен. bash только что сделал это, но у Дженкинса не получилось.

Вы можете добавить || true к своему заданию jenkins, чтобы указать jenkins, чтобы продолжить задание, если команда bash не удалась.

Так что это:

fuser -k 5000/tcp || true

см. также не прерывать сборку jenkins при сбое выполнения оболочки

person elodingens    schedule 04.09.2017

Попробуйте поставить команду с путем

/usr/bin/kill $(/usr/sbin/lsof -i -t:5000)

Если пользователь, запускающий службу jenkins, не совпадает с пользователем с процессом на порту 5000, вы не сможете убить процесс. Возможно, вам нужно будет запустить это с помощью sudo.

Попробуй это

su -s jenkins #Or the user who run jenkins
/usr/bin/kill $(/usr/sbin/lsof -i -t:5000)
person Joao Vitorino    schedule 21.06.2017
comment
когда порт 5000 не существует, jenkins остановится и завершится ошибкой. Как позволить ему продолжать успех. - person Gank; 01.06.2020

возможно, пользователь jenkins не может видеть процессы из-за привилегий, поэтому расширение $(lsof ..) пусто.

вывод ошибки может быть неполным, потому что в случае сбоя вызова lsof на stderr появится сообщение.

person Nahuel Fouilleul    schedule 21.06.2017

Проблема в том, что $ — это специальный символ в командах jenkins. Это означает, что вы имеете в виду ENV VAR.

Вы должны попробовать написать команду, заключенную в одинарные кавычки.

person Carlos Augusto Pega    schedule 22.06.2017

Я столкнулся с той же проблемой, и во многих случаях стандартный ввод/вывод отключен (особенно, когда у вас есть ssh на целевой машине). Что вы можете сделать, так это создать исполняемый файл оболочки на целевом сервере и выполнить этот файл.

Таким образом, шаг будет выглядеть примерно так:

Шаг 1 . -> создать файл оболочки

 cat > kill_process.sh << EOF
 target_port_num=\`lsof -i:\${1} -t\`;
 echo "Kill process at port is :: \${target_port_num}"
 kill -9 \${target_port_num}
 EOF

Шаг 2 . -> сделать его исполняемым chmod +x process_killer.sh

Шаг 3 . -> выполнить оболочку и передать номер порта ./process_killer.sh 3005

Надеюсь, это поможет.

person SK -    schedule 18.01.2019