【发布时间】:2012-08-02 00:24:17
【问题描述】:
什么会导致 .sh 脚本在 SSH shell 中正常工作,但在通过 PHP 或 crontab 执行时却不行?
我有一个运行游戏服务器的 VPS,但为了使其可维护,我计划自动化大部分繁琐的过程(如设置或删除服务器)并制作重要功能(如启动和停止)服务器)很容易被真正需要它的人接受。
现在,当我制作 shell 脚本并对其进行测试时,它们工作得非常好。 startserver 启动了服务器,restartserver 重新启动了它,等等。但是当从 PHP 运行时,或者 - 正如我后来发现的 - crontab,启动服务器神奇地不起作用。停止它们,检查它们是否正在运行,更新和所有其他功能都按预期工作,但启动服务器并没有做任何事情。它只是返回 0 而没有打印任何内容。
例如,以下是在任何一种情况下都有效的脚本示例:(statusserver.sh)
/sbin/start-stop-daemon -v -t --start --exec ~mta/servers/$1/files/mta-server -- -d
这是一个在任何情况下都不起作用的:(startserver.sh)
/sbin/start-stop-daemon -v --start --exec ~mta/servers/$1/files/mta-server -- -d
唯一的区别是 statusserver.sh 有“-t”,它只会告诉你在没有 -t 的情况下执行相同的命令是否真的会成功。并像这样执行 statusserver.sh:
sudo -u mta ~mta/sh/statusserver.sh test
确实可以,打印一些类似于“Would start ~mta/servers/test/files/mta-server -d”的内容。但是这样做:
sudo -u mta ~mta/sh/startserver.sh $2
什么都不做。它不打印任何东西,它实际上返回0。(这应该意味着操作成功)
现在是有趣的部分:当服务器已经在运行时,startserver.sh 会做它应该做的事情:假设服务器已经在运行,并返回一个错误代码。 (因为 start-stop-daemon 对我来说很友好)但它完全拒绝启动任何东西。
将 start-stop-daemon 替换为:
sudo -u mta ~mta/servers/test/files/mta-server -d
做同样的事情:它只是拒绝运行,同时仍然返回 0。
哦,顺便说一句,这不是 sudo 问题。这一点我很确定,因为以下也可以正常工作
sudo -u web1 sudo -u mta ~mta/scripts/startserver.sh test
回到我的问题:什么会导致 Linux、Shell、Bash 或其他任何东西在通过 PHP 或 crontab 运行时拒绝启动应用程序,而在通过 SSH 启动时愉快地接受它?我需要切换任何设置吗?任何可以阻止我想做的事情的包?还有什么我只是想念的吗?
【问题讨论】:
-
您是否将脚本或二进制文件指定为可执行文件?
-
是的。我在其他用户的主文件夹中触发 shell 脚本以完成各种操作,并且在使用 SSH 触发它们时它们都起作用。但是,使用 PHP 时,启动命令不会触发。