我有一个python脚本我想在ubuntu ec2实例上启动但是我遇到了麻烦。
脚本在循环中运行并在准备就绪时小心或退出,因此我不需要在运行后启动或停止它。
我已经阅读并尝试了很多方法,取得了不同程度的成功,老实说,我对最好的方法感到困惑。我已经尝试了一个shell脚本,它在/etc/init.d中启动python脚本,使其可执行并执行update-rc.d以尝试使其运行但在每个阶段都失败了。
这是我尝试的脚本的内容:
#!/bin/bash
cd ~/Dropbox/Render\ Farm\ 1/appleseed/bin
while :
do
python ./watchfolder18.py -t ./appleseed.cli -u ec2 ../../data/
done
然后我做了
sudo chmod +x /etc/init.d/script_name
sudo sudo update-rc.d /etc/init.d/script_name defaults
这似乎没有在启动时运行,我不知道为什么,如果我手动运行命令它按预期工作。
我还尝试在rc.local中添加一行来启动脚本,但这似乎不起作用
任何人都可以分享他们发现的最简单的方法,在后台运行python脚本,并在启动ec2实例时使用参数。
更新:----------------------
我已将此代码移至名为/home/ubuntu/bin/watch_folder_start
#!/bin/bash
cd /home/ubuntu/Dropbox/Render\ Farm\ 1/appleseed/bin
while :
do
python ./watchfolder18.py -t ./appleseed.cli -u ec2 ../../data/
done
并将我的rc.local
文件更改为:
nohup /home/ubuntu/bin/watch_folder_start &
exit 0
当我手动运行rc.local但在启动时不会启动时,哪个有效,我做chmod +x rc.local
但是没有改变任何内容,
答案 0 :(得分:0)
您的/etc/init.d/script_name
缺少update-rc.d
等使用的管道,并且无法正确处理stop
,start
和其他init-variety命令,因此...
对于初步实验,请利用/etc/init.d/rc.local
脚本(默认情况下应从/etc/rc2/S99rc.local
链接)。这使您无需担心init.d约定,只需在/etc/rc.local
之前向exit 0
添加内容。
此外,不会定义~
,您需要使用完整路径名 - 此外,脚本将以root身份运行。如果需要,我们将解决如何避免这种情况。在其中任何一个中,你都需要用更有用的东西来代替“whoeveryouare”。还要注意,您可能需要在python
命令前加上su
命令和一些参数,以便使用您可能需要的用户ID来运行该进程。
您可以尝试(在/etc/rc.local
中):
( if cd '/home/whoeveryouare/Dropbox/Render Farm 1/appleseed/bin' ; then
while : ; do
# This loop should respawn watchfolder18.py if it dies, but
# ideally one should fix watchfolder18.py and remove this loop.
python ./watchfolder18.py -t ./appleseed.cli -u ec2 ../../data/
done
else
echo warning: could not find watchfolder 1>&2
fi
) &
您也可以将所有内容放在脚本中,然后从/etc/rc.local
调用它。
第一遍大概就是你所拥有的,但如果我们假设watchfolder18.py
将安排避免死亡,我们可以将其降低到:
( cd '/home/whoeveryouare/Dropbox/Render Farm 1/appleseed/bin' \
&& exec python ./watchfolder18.py -t ./appleseed.cli -u ec2 ../../data/ ) &
这些并不是那么漂亮,但它应该让你的守护进程整理出来以便你可以调试它等等,然后再回来制作一个合适的/etc/init.d
或/etc/init
脚本。这样的事情可能会在/etc/init/watchfolder.conf
中发挥作用,但我还不足以宣称这不仅仅是粗暴刺激它:
# watchfolder - spawner for watchfolder18.py
description "watchfolder program"
start on runlevel [2345]
stop on runlevel [!2345]
script
if cd '/home/whoeveryouare/Dropbox/Render Farm 1/appleseed/bin' ; then
exec python ./watchfolder18.py -t ./appleseed.cli -u ec2 ../../data/0
fi
end script
答案 1 :(得分:0)
我发现最终的最佳解决方案是使用'upstart'并在名为etc/init
的{{1}}中创建一个包含以下内容的文件
myfile.conf
有关在此处使用upstart系统的更多信息
https://help.ubuntu.com/community/UbuntuBootupHowto
http://blog.joshsoftware.com/2012/02/14/upstart-scripts-in-ubuntu/