LINUX.ORG.RU

Почему в Ansible команда «pkill -f nginx || true» возвращает ненуливой код ошибки?

 , , error code, pkill, код возврата


0

1

Столкнулся с очередной загадкой.

Если на целевом хосте в SSH-консоли выполнить команду:

pkill -f nginx || true

То она успешно выполняется, код ошибки, видимый через команду echo $?, всегда нуливой.

Если ту же команду сделать через Ansible:
   - name: "Остановка сервиса Nginx - дополнительный метод"                                                                
     shell: "pkill -f nginx || true"

Тогда эта команда всегда заканчивается ненулевым кодом возврата:
fatal: [siteHost]: FAILED! => {
"changed": true, 
"cmd": "pkill -f nginx || true", 
"delta": "0:00:00.009630", 
"end": "2023-07-01 15:35:48.555054", 
"msg": "non-zero return code", 
"rc": -15, 
"start": "2023-07-01 15:35:48.545424", 
"stderr": "", 
"stderr_lines": [], 
"stdout": "", 
"stdout_lines": []}


Чтобы «съэмулировать» поведение Ansible, я в SSH-консоли удаленного хоста стал выполнять команды:
# bash -c "pkill -f nginx" 
# echo $?
1

# bash -c "exec pkill -f nginx" 
# echo $?
1

# bash -c "pkill -f nginx ; true" 
Terminated
# echo $?
143

# bash -c "pkill -f nginx || true" 
Terminated
# echo $?
143

Похоже, действительно у pkill есть какие-то особенности, которые влияют на код возврата. Но непонятно почему вызов true этот код не подавляет.

В общем, я не пойму как составить команду, которая будет завершаться нуливым кодом возврата в комбинации с pkill.

★★★★★
Ответ на: комментарий от router

Не хочется влезать в чужие разборки, но все же, в чем разница между

pkill -f nginx || true

bash -c «pkill -f nginx || true»

bash -c же просто запускает ещё один шелл и в нем интерпретирует команду и запускает соответствующие процессы. Или разница может быть в окружении, типа сколько экземпляров nginx запущено?

filosofia
()
Ответ на: комментарий от filosofia

bash -c же просто запускает ещё один шелл и в нем интерпретирует команду и запускает соответствующие процессы.

В первом случае будет закрыт и твой шел

Но у ТС была разница в других командах. В одном случае bash у него успевал обработать завершение дочерних процессов, в другом должен был запустить вторую команду или дождаться ее завршения, не успевал и завершался по сигналу sigterm

router ★★★★★
()
Ответ на: комментарий от filosofia

Хоть напиши чистый pkill, хоть через bash -c, все равно сама команда удалит не только процессы, на которые она нацелена, но и сам процесс, который выполняется, потому что в самой команде присутствует подстрока «nginx».

В случае с ansible, удалялся и процесс, который создает ansible для выполнения этой команды.

Поэтому пришлось делать трюк с регулярным выражением, чтобы сама команда не содержала строки в явном виде, которую она ищет. Чтобы она сама себя не удаляла.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ты имеешь в виду, что pkill -f матчит как по имени команды так и по ее аргументам? Наверное есть опции pkill, чтобы сделать ее поведение строже? Я обычно убиваю процессы по имени killall, он такой фигней не страдает AFAIK.

filosofia
()