我在/etc/init.d中有一个守护进程脚本,它使用tcpdump命令执行一些后台数据包logging。 脚本使用sudo /etc/init.d/packetlog start使用交互式shell 启动正常
当我通过我的结构脚本(下面)执行相同的命令时,该命令成功返回,但进程没有运行。
def startpacketlog(): sudo(r'/etc/init.d/packetlog start')
除此之外,服务不会像我预料的那样在启动时自动启动。
一些技巧来解决这个将不胜感激
脚本在这里,并从这个原始的修改
更新这似乎是一个普遍的问题,在这台主机上使用fabric启动任何服务。 当启动apache2服务时,我得到同样的问题。 尽pipe我可以成功地停止使用结构的服务。
更新2重新阅读文档和一些实验后,下面的修改解决了这个问题。 (这会禁用远程伪terminal,不pipe是什么)
def startpacketlog(): sudo(r'/etc/init.d/packetlog start',pty=False)
当你直接调用一个init脚本时,你当前的环境可能会“泄漏”到init脚本中。
使用适当的系统工具testing你的init脚本:
# Redhat/CentOS, and Ubuntu with upstart sudo service packetlog start # traditional method on Debian/Ubuntu sudo invoke-rc.d packetlog start
这些将确保脚本在干净的环境中启动,与init启动时的脚本相同。