Чистый способ запуска оболочки 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 &

Надеюсь, это поможет кому-то!