我在 /etc/init.d 中有一个守护进程脚本,它使用tcpdump命令。脚本使用交互式 shell 正常启动,使用sudo /etc/init.d/packetlog 启动
当我通过我的结构脚本(如下)执行相同的命令时,该命令成功返回,但进程未运行。
def startpacketlog():
sudo(r'/etc/init.d/packetlog start')
此外,该服务并不会像我预期的那样在启动时自动启动。
希望能有一些关于如何解决此问题的提示
更新 这似乎是使用 fabric 启动此主机上的任何服务时出现的一般问题。启动 apache2 服务时,我遇到了同样的问题。但我可以成功使用 fabric 停止服务。
更新 2 重读后文档经过一些实验,以下更改解决了该问题。(这将禁用远程伪终端,无论它是什么)
def startpacketlog():
sudo(r'/etc/init.d/packetlog start',pty=False)
答案1
当您直接调用初始化脚本时,您当前的环境可能会“泄漏”到初始化脚本中。
使用适当的系统工具测试你的初始化脚本:
# Redhat/CentOS, and Ubuntu with upstart
sudo service packetlog start
# traditional method on Debian/Ubuntu
sudo invoke-rc.d packetlog start
这些将确保脚本在干净的环境中启动,与 init 启动时的环境相同。