Подтвердить что ты не робот

Выполнение оболочки script с системой() возвращает 256. Что это значит?

Я написал оболочку script для перезапуска HAProxy (обратного прокси). Выполнение script из оболочки работает. Но я хочу, чтобы демон выполнял script. Это не работает. system() возвращает 256. Я не знаю, что это может означать.

#!/bin/sh
# save previous state
mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.old
mv /var/run/haproxy.pid /var/run/haproxy.pid.old

cp /tmp/haproxy.cfg.new /home/haproxy/haproxy.cfg
kill -TTOU $(cat /var/run/haproxy.pid.old)
if haproxy -p /var/run/haproxy.pid -f /home/haproxy/haproxy.cfg; then
  kill -USR1 $(cat /var/run/haproxy.pid.old)
  rm -f /var/run/haproxy.pid.old
  exit 1
else
  kill -TTIN $(cat /var/run/haproxy.pid.old)
  rm -f /var/run/haproxy.pid
  mv /var/run/haproxy.pid.old /var/run/haproxy.pid
  mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.err
  mv /home/haproxy/haproxy.cfg.old /home/haproxy/haproxy.cfg
  exit 0
fi

HAProxy выполняется с помощью пользователя haproxy. У моего демона тоже есть собственный пользователь. Оба работают с sudo.

Любые подсказки?

4b9b3361

Ответ 1

Согласно this и который, Perl system() возвращает значения выхода, умноженные на 256. Таким образом, он фактически выходит с помощью 1. Кажется, это происходит в C тоже.

Ответ 2

Если система не возвращает -1, ее возвращаемое значение имеет тот же формат, что и значение статуса из семейства ожидающих системных вызовов (man 2 wait). Существуют макросы, которые помогут вам интерпретировать этот статус:

man 3 wait

Перечисляет эти макросы и то, что они вам говорят.

Ответ 3

Код из 256, вероятно, означает, что системная команда не может найти бинарный файл для ее запуска. Помните, что он не может вызывать bash и что у него могут не быть настройки путей. Повторите попытку с полными путями к двоичным файлам!

Ответ 4

У меня такая же проблема, когда вызов script, содержащий команду `kill 'в демона. Демон должен был закрыть stdout, stderr... Использовать что-то вроде системы ( "scrips.sh > /dev/null" ) должно работать.