Чистый способ запуска оболочки script в фоновом режиме от Дженкинса
Какой правильный способ запускать script из jenkins, не получить зависание сборки и оставить процесс запущенным? Кажется, я не могу заставить его работать. Либо script не запускается, либо создается зависание.
Если я поставлю шаг сборки "Execute shell" bash relaunch.sh &
или relaunch.sh > output.log &
или nohup bash relaunch.sh &
,
Ничего не произошло; построить завершение, но процесс не выполняется. Я думаю, это может быть связано с Дженкинсом, ожидающим закрытия протокола ошибки.
Если я это сделаю
nohup bash relaunch.sh 2>&1 > output.log
как предложено здесь, вывод перенаправляется правильно, но сборка зависает (не заканчивается), и процесс умирает, когда я убиваю сборку.
Добавление export BUILD_ID=dontKillMe
, как предложено здесь, здесь и здесь, либо на шаг "Выполнять оболочку", либо сам script тоже не помогает. Конструкция зависает, и процесс умирает, когда я убиваю сборку. Излишне говорить, что мои знания Linux очень ограничены.
Как люди делают это чистым способом?
Ответы
Ответ 1
Удобный способ добиться этого - изменить переменную среды BUILD_ID
в оболочке Execute, которая ищет Jenkins's
ProcessTreeKiller. для.
Сделав это,
BUILD_ID=dontKillMe nohup bash relaunch.sh &
Дженкинс предположит, что фоновая работа не порождена сборкой и не будет убивать их после завершения задания.
Благодаря Joshua для его наблюдения, что вы также можете использовать JENKINS_NODE_COOKIE
как
JENKINS_NODE_COOKIE=dontKillMe
Ответ 2
У меня была такая же проблема.
Я закончил это исправлением, разместив в окне оболочки Jenkins следующее:
BUILD_ID=dontKillMe ./grid.sh
Я переместил &
в файл script. Вот что выглядит script:
#!/bin/bash
java -jar selenium-server-standalone-3.0.1.jar -role hub &
Надеюсь, это поможет кому-то!