【问题标题】:ubuntu ec2 - run python script at startup with argumentsubuntu ec2 - 在启动时使用参数运行 python 脚本
【发布时间】:2013-06-26 19:17:46
【问题描述】:

我有一个 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 中添加一行来启动脚本,但这似乎也不起作用

任何人都可以分享他们发现的最简单的方法,即在启动 ec2 实例时使用参数在后台运行 python 脚本。

更新:----------

我已将此代码移至名为 /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 但这并没有改变任何东西,

【问题讨论】:

  • 只是猜测:您的脚本会打印到终端吗?在这种情况下,它会死。将您的输出重定向到日志文件或类似的东西。

标签: python amazon-ec2 startup init.d


【解决方案1】:

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

对于初始实验,利用/etc/init.d/rc.local 脚本(默认情况下应从/etc/rc2/S99rc.local 链接到该脚本)。这让您不必担心 init.d 约定,只需在 exit 0 末尾添加内容到 /etc/rc.local

此外,~ 不会被定义,您需要使用完整的路径名 - 而且脚本将以 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

【讨论】:

  • 很有趣,感谢您的回复。我制作了一个新脚本,其中包含放入/home/ubuntu/bin/watch_folder_start 的while 循环,并将这一行添加到我的rc.local 文件nohup /home/ubuntu/bin/watch_folder_start & 中。当我手动运行 rc.local 时,脚本按预期工作并且守护程序运行良好,但它仍然不会在启动时触发,我尝试 chmod + rc.local 但这似乎也不起作用,任何进一步的想法
  • 确保使用chmod 755 /etc/rc.local/etc/rc.local 设置回正常烫发。从sudo su - root 内部进行测试,其中一个运行/etc/rc2.d/S99rc.local start(假设您的主机默认为运行级别2 - 请检查who -r 以确保)。我最终在/etc/rc.local 中添加了touch /tmp/rc.local-ran 以证明它正在执行,因为“运行本地启动脚本(/etc/rc.local)”仅在启用 VERBOSE(不是默认设置)时才会显示。 nohup 在这里不正常,( cd ... && exec ... ) & 在这里适合我。在我的盒子上花了大约 1 分钟才能看到 rc.local 启动。
【解决方案2】:

我发现最终最好的解决方案是使用'upstart'并在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/

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 2014-08-22
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多