ubuntu ec2 - 在启动时使用参数运行python脚本

时间:2013-06-28 22:17:28

标签: python amazon-ec2 startup init.d

我有一个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但是没有改变任何内容,

2 个答案:

答案 0 :(得分:0)

您的/etc/init.d/script_name缺少update-rc.d等使用的管道,并且无法正确处理stopstart和其他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系统的更多信息

http://upstart.ubuntu.com/

https://help.ubuntu.com/community/UbuntuBootupHowto

http://blog.joshsoftware.com/2012/02/14/upstart-scripts-in-ubuntu/