Выполнение сценария оболочки с помощью system () возвращает 256. Что это значит? - PullRequest
15 голосов
/ 17 сентября 2010

Я написал сценарий оболочки для мягкого перезапуска HAProxy (обратный прокси). Выполнение скрипта из оболочки работает. Но я хочу, чтобы демон выполнял скрипт. Это не работает 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.

Есть подсказки?

Ответы [ 4 ]

30 голосов
/ 17 сентября 2010

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

6 голосов
/ 17 сентября 2010

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

man 3 wait

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

0 голосов
/ 12 августа 2015

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

0 голосов
/ 22 января 2013

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

...