ubuntu ec2 - запускать скрипт python при запуске с аргументами

У меня есть скрипт python, который я хотел бы запустить при запуске экземпляра ubuntu ec2, но у меня возникают проблемы.

Сценарий работает в цикле и заботится или завершает работу, когда он готов, поэтому мне не нужно запускать или останавливать его после его запуска.

Я читал и пробовал много подходов с разной степенью успеха и, честно говоря, не понимаю, какой подход лучше всего. Я попытался поместить сценарий оболочки, который запускает сценарий python в /etc/init.d, сделав его исполняемым и выполнив 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, но это ничего не изменило,


person jonathan topf    schedule 28.06.2013    source источник
comment
Только предположение: ваш скрипт печатает на терминал? В таком случае он умрет. Перенаправьте вывод в файлы журналов или что-то подобное.   -  person Matthias    schedule 29.06.2013
comment
ознакомьтесь с этим руководством (aameer.github.io/cloud-computing-101)   -  person Aameer    schedule 01.04.2016


Ответы (2)


В вашем /etc/init.d/script_name отсутствует коммуникация, которую используют update-rc.d и так далее, и он не будет должным образом обрабатывать stop, start и другие команды инициализации, так что...

Для первоначального эксперимента воспользуйтесь скриптом /etc/init.d/rc.local (который по умолчанию должен быть связан с /etc/rc2/S99rc.local). Это избавляет вас от необходимости беспокоиться о соглашениях init.d и просто добавляет что-то в /etc/rc.local перед exit 0 в конце.

Кроме того, этот ~ не будет определен, вам нужно будет использовать полное имя пути, и, кроме того, скрипт будет работать от имени пользователя root. Чуть позже мы рассмотрим, как этого избежать. В любом из них вам нужно будет заменить «кем бы вы ни были» на что-то более полезное. Также имейте в виду, что вам может потребоваться префикс команды python с командой su и некоторыми аргументами, чтобы запустить процесс с идентификатором пользователя, который вам может понадобиться.

Вы можете попробовать (в /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
person Alex North-Keys    schedule 29.06.2013
comment
интересно, спасибо за ответ. Я создал новый скрипт, содержащий цикл while, который был помещен в /home/ubuntu/bin/watch_folder_start, и добавил эту строку в мой файл rc.local nohup /home/ubuntu/bin/watch_folder_start &. Когда я запускаю rc.local вручную, сценарий работает, как и ожидалось, и демон работает счастливо, но он по-прежнему не срабатывает при запуске, я попытался chmod + rc.local, но это, похоже, тоже не сработало, дальнейшие мысли - person jonathan topf; 29.06.2013
comment
Убедитесь, что вы вернули /etc/rc.local нормальные разрешения с помощью chmod 755 /etc/rc.local. Протестируйте изнутри sudo su - root, в котором запускается /etc/rc2.d/S99rc.local start (при условии, что ваш хост по умолчанию использует уровень запуска 2 - проверьте who -r, чтобы быть уверенным). Я закончил тем, что добавил touch /tmp/rc.local-ran в /etc/rc.local, чтобы доказать, что он выполняется, поскольку Запуск сценариев локальной загрузки (/etc/rc.local) отображается только в том случае, если включена VERBOSE (не по умолчанию). nohup здесь ненормально, а ( cd ... && exec ... ) & мне здесь подходит. На моем компьютере потребовалось около 1 минуты, чтобы увидеть запуск rc.local. - person Alex North-Keys; 29.06.2013

Я обнаружил, что в конце концов лучшим решением было использовать «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

Подробнее об использовании системы upstart здесь

http://upstart.ubuntu.com/

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

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

person jonathan topf    schedule 29.06.2013