1

我有一个 python 脚本,我想在 ubuntu ec2 实例上启动,但我遇到了麻烦。

该脚本在循环中运行,并在它准备好时小心或退出,所以我不应该在它运行后启动或停止它。

我已经阅读并尝试了很多不同程度的成功方法,老实说,我对什么是最好的方法感到困惑。我尝试在 /etc/init.d 中放置一个启动 python 脚本的 shell 脚本,使其可执行并执行 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但这并没有改变任何东西,

4

2 回答 2

0

/etc/init.d/script_name缺少update-rc.d等使用的管道,并且无法正确处理stop,start和其他 init-variety 命令,所以...

对于初始实验,请利用/etc/init.d/rc.local脚本(默认情况下应链接到 from /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
于 2013-06-29T07:06:06.717 回答
0

我发现最终最好的解决方案是使用“新贵”并在etc/init调用myfile.conf中创建一个包含以下内容的文件

description "watch folder service"
author      "Jonathan Topf"

start on startup

stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

script
    HOST=`hostname`
    chdir /home/ubuntu/Dropbox/Render\ Farm\ 1/appleseed/bin
    exec /usr/bin/python ./watchfolder.py -t ./appleseed.cli -u $HOST ../../data/  >> /home/ubuntu/bin/ec2_server.log 2>&1
    echo "watch_folder started"
end script

更多关于使用暴发户系统的信息在这里

http://upstart.ubuntu.com/

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

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

于 2013-06-29T21:14:09.620 回答