web-dev-qa-db-ja.com

system()でシェルスクリプトを実行すると、256が返されます。これはどういう意味ですか?

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で実行されます。

ヒントはありますか?

19
Jan Deinhard

thisthat によれば、Perlのsystem()は256を掛けた終了値を返します。つまり、実際には1で終了しています。 これはCでも起こります のようです。

31
Skilldrick

システムが-1を返さない限り、その戻り値は、システムコールの待機ファミリ(man 2待機)からのステータス値と同じ形式です。このステータスの解釈に役立つマクロがあります。

man 3 wait

これらのマクロとそれらがあなたに言うことをリストします。

6
nategoose

256のコードは、システムコマンドがバイナリを見つけて実行できないことを意味します。 bashを呼び出していない可能性があり、パスが設定されていない可能性があることに注意してください。バイナリへのフルパスでもう一度お試しください!

0
user2000703

デーモンで「kill」コマンドを含むスクリプトを呼び出すときにも同じ問題が発生します。デーモンはstdout、stderrを閉じている必要があります... system( "scrips.sh>/dev/null")のようなものを使用してください。

0
Xiaofeng