Внутри Jenkins мне нужно запустить 2 отдельных скрипта: start.sh и stop.sh. Эти сценарии находятся внутри моего приложения, которое извлекается из SCM. Они находятся внутри одного каталога.
Сценарий start.sh запускает процесс в фоновом режиме, используя nohup, и записывает processId
в save_pid.pid
. Этот скрипт работает нормально. Он успешно запускает мое приложение.
Затем внутри stop.sh я пытаюсь прочитать processId
из save_pid.pid
, чтобы удалить процесс. Но я не могу удалить процесс, и приложение продолжает работать, пока я не уничтожу процесс вручную, используя: sudo kill {processId}
.
Вот подходы, которые я уже пробовал внутри stop.sh, но ни один из них не работает:
kill $(cat /path/to/save_pid.pid)
kill `cat /path/to/save_pid.pid`
kill -9 $(cat /path/to/save_pid.pid)
kill -9 `cat /path/to/save_pid.pid`
pkill -F /path/to/save_pid.pid
Я также пробовал все эти шаги с sudo
. Но это просто не работает. Я сохранил оператор echo
внутри stop.sh, который печатает, а затем ничего не происходит.
Что я здесь делаю неправильно?
ОБНОВЛЕНИЕ:
Команда nohup
, которую я использую внутри start.sh, выглядит примерно так:
nohup deploy_script > $WORKSPACE/app.log 2>&1 & echo $! > $WORKSPACE/save_pid.pid
Обратите внимание:
В моем случае значение, записанное внутри
save_pid.pid
, на удивление всегда меньше на 1, чем фактическое значениеprocessId
. !!!
nohup deploy_script > $WORKSPACE/app.log 2>&1 & echo $! > $WORKSPACE/save_pid.pid; pgrep sleep
, но это не сработало. На самом деле разница между созданным идентификатором и фактическим идентификатором теперь равна 2. 19.11.2017pgrep sleep
к моему скрипту nohup, как я показал в своем предыдущем комментарии, я все еще не получаю точноеprocessId
внутриsave_pid.pid
. 19.11.2017pgrep sleep
не поможет вам получить PID процесса. PID выключен на 2, потому что очевидно, что PID, который вы получаете, является PID shell, который выполняет ваш скрипт, а не PID процесса, который вы запускаете. Чтобы получить PID процесса, который вы запускаете, вам нужно вывестиecho $!
внутри скрипта. 19.11.2017deploy_script
. Он автоматически генерируется системой сборки моего приложения каждый раз, когда я запускаю приложение. Что вы предлагаете мне делать в таком случае? Мне все еще нужно запустить скрипт в фоновом режиме. 19.11.2017nohup deploy_script > $WORKSPACE/app.log 2>&1 & echo $(( $! - 1 )) > $WORKSPACE/save_pid.pid
но это точно уродливый хак! 19.11.2017Under Unix, process IDs are usually allocated on a sequential basis, beginning at 0 and rising to a maximum value which varies from system to system. Once this limit is reached, allocation restarts at zero and again increases. However, for this and subsequent passes any PIDs still assigned to processes are skipped
. Так что, я думаю, все еще есть крошечный шанс вернуться к нулю или есть шанс, что следующий номер будет пропущен. 19.11.2017