【问题标题】:Executing shell script with system() returns 256. What does that mean?使用 system() 执行 shell 脚本返回 256。这是什么意思?
【发布时间】:2011-04-13 18:34:00
【问题描述】:

我编写了一个 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 运行。

有什么提示吗?

【问题讨论】:

    标签: c linux shell daemon


    【解决方案1】:

    在守护进程中调用包含“kill”命令的脚本时,我遇到了同样的问题。 守护进程必须关闭标准输出、标准错误... 使用类似 system("scrips.sh > /dev/null") 的东西应该可以工作。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 没有。如果找不到可执行文件,它将返回 -1。
      【解决方案3】:

      除非系统返回 -1,否则它的返回值与系统调用的等待系列(man 2 wait)中的状态值具有相同的格式。有一些宏可以帮助您解释这种状态:

      man 3 wait
      

      列出这些宏以及它们告诉您的内容。

      【讨论】:

        【解决方案4】:

        根据thisthat,Perl 的system() 返回的退出值乘以256。所以它实际上是用1 退出的。好像是this happens in C too

        【讨论】:

        • 谢谢!所以它是 EPERM /* Operation not allowed */ ...但是为什么...我用 sudo 启动守护进程。
        • Perl 不返回相乘的退出值。它返回一个 16 位的值,退出代码在高 8 位。它通常是相同的,但并非总是如此。
        • 这也适用于大多数 Linux/gcc 二进制文件,不仅仅是 Perl。
        猜你喜欢
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多