使用system()执行shell脚本返回256,这是什么意思?

24

我写了一个Shell脚本来软重启HAProxy(反向代理)。从shell中执行脚本是可以的。但我想让守护进程执行脚本。这并不起作用。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个回答

37

2
谢谢!所以是 EPERM /* 操作不允许 */ ... 但为什么...我使用 sudo 启动守护进程。 - Jan Deinhard
4
Perl不返回乘以退出值的结果,它会返回一个16位值,其中退出代码存储在高8位中。通常情况下这两个值是相同的,但并非总是如此。 - mivk
1
这也适用于大多数Linux/gcc二进制文件,不仅限于Perl。 - Victor Sergienko

6

除非系统返回-1,否则其返回值与wait系统调用家族(man 2 wait)的状态值格式相同。有一些宏可以帮助你解释这个状态:

man 3 wait

列出这些宏并告诉您它们的含义。

3

代码256可能意味着系统命令无法找到二进制文件来运行它。记住,它可能没有调用bash并且可能没有设置路径。尝试使用完整的二进制文件路径再次运行!


1
如果找不到可执行文件,它会返回-1。 - mivk

0
当调用守护进程中包含 `kill` 命令的脚本时,我遇到了同样的问题。 守护进程必须关闭标准输出和标准错误... 使用类似 system("scrips.sh > /dev/null") 的方法应该可以解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接