我有几个需要运行的基于 Python 的服务器,并希望它们在我启动 Ubuntu Server 时自动启动。执行它们的最佳方法是什么?
我希望我可以编写一个 Bash 脚本并使用 Screen 让它们在后台运行,这样我就可以时不时地检查它们,但是
echo screen -d -m python
工作正常,
echo screen -d -m `sudo python /home/matt/tornadoServer/tornadoDeploy.py`
没有,没有错误消息。这与空格有关吗?即使我用反引号括起来了?我还尝试过:
WEB="screen -d -m `sudo python /home/matt/tornadoServer/tornadoDeploy.py`"
echo $WEB
作为一种转义空格的方法,但没有成功。Bash 脚本有什么方法可以做到这一点?
并且,一旦 Bash 脚本运行,我应该把它放在哪里以使其在启动时执行?
答案1
失败是因为sudo
提示输入密码。由于没有打开 TTY,它只是在等待您输入密码——或者实际上可能会立即失败。如果您以 root 身份运行它,则无需以 sudo 身份启动它。
但是,您可能想要做的是修改 tornadoDeploy.py 以将其自身作为守护进程,即分离自身,以便它不会在打开的会话中运行。python-daemonize 库提供简单的工具来帮助您完成此操作。这样就无需处理屏幕,同时仍允许您守护进程。
答案2
放
sudo -n python /home/matt/tornadoServer/tornadoDeploy.py &
进入文件 /etc/rc.d/rc.local。或者任何适用于您的发行版的等效文件。
假设您的脚本是一个行为良好的守护进程,并且您已经设置 sudo 不需要密码来运行您的脚本。
读这关于启动脚本和这关于 python 守护进程库。另外,你不必运行 tornado在真正的 http 服务器后面?
答案3
Ubuntu(和 Debian)让应用程序在启动时启动的方法是使用 update-rc.d 将它们转变为系统服务——请参阅此处的说明:http://www.debuntu.org/how-to-manage-services-with-update-rc.d
请记住,以 root 身份运行的任何东西都存在潜在的安全漏洞,特别是如果其他用户可以修改它。
答案4
如果从 rc.local 运行它,您还需要编辑 /etc/sudoers 并注释此字符串:
默认要求