Я пытаюсь и не могу запустить длительную команду при запуске EC2 (Amazon Linux). Он должен работать под учетной записью пользователя ec2. Это была моя первая попытка:
#!/bin/bash
echo 'Woot 1!' > /home/ec2-user/woot1.txt
pushd /home/ec2-user/my-app-dir
nohup sudo -u ec2-user /home/ec2-user/my-app-dir/my_process.py &
echo 'Woot 2!' > /home/ec2-user/woot2.txt
Ключевой командой, которую я пытаюсь запустить, является строка «nohup» для запуска my_process.py.
Сценарий оболочки работает, когда я запускаю его от имени пользователя root из оболочки, но когда я передаю его в пользовательских данных экземплярам ec2-run и авторизуюсь в экземпляре, я вижу и woot1.txt, и woot2.txt, но my_process.py не работает. Более того, my_process.py создает файл журнала при запуске, но там нет файла журнала (и нет nohup.out), когда я передаю сценарий в качестве пользовательских данных экземплярам ec2-run.
Я пробовал поместить то же самое в форму cloud-init с теми же результатами:
#cloud-config
runcmd:
- echo 'Woot 1!' > /home/ec2-user/woot1.txt
- pushd /home/ec2-user/my-app-dir
- nohup sudo -u ec2-user /home/ec2-user/my-app-dir/my_process.py &
- echo 'Woot 2!' > /home/ec2-user/woot2.txt
Если кто-нибудь может сказать мне, в чем я ошибаюсь, я был бы признателен.
Причина, по которой процесс не запускался, заключалась в том, что экземпляр Amazon EC2 Linux похож на Red-Hat, и в этих дистрибутивах есть ошибка / функция, требующая для команды sudo tty. Во время обработки cloud-init к среде не привязан tty, поэтому он не работает.
Один ответ - отредактировать etc / sudoers и изменить строку
Defaults requiretty
к
Defaults !requiretty
По-видимому, есть и другие подходы, но у меня это сработало.
Я предполагаю, что к этой команде не привязана оболочка.
Вместо того
- echo 'Woot 1!' > /home/ec2-user/woot1.txt
Пытаться
- /bin/sh -c "echo 'Woot 1!' > /home/ec2-user/woot1.txt"