У меня есть установка AWS Elastic Beanstalk с некоторыми .ebextensions
файлами с некоторыми container_commands
в них.Одной из таких команд является скрипт.Сценарий завершается, но следующая команда не запускается.
$ pstree -p | grep cfn-
|-cfn-hup(2833)-+-command-process(10161)---command-process(10162)-+-cfn-init(10317)---bash(10428)
$ ps 10317
PID TTY STAT TIME COMMAND
10317 ? S 0:00 /usr/bin/python2.7 /opt/aws/bin/cfn-init -s arn:aws:cloudformation:us-east-1:278460835609:stack/awseb-e-4qwsypzv7u-stack/f8ab55f0-393c-11e9-8907-0ae8cc519968 -r AWSEBAutoScalingGroup --region us-east-1 --configsets Infra-EmbeddedPostBuild
$ ps 10428
PID TTY STAT TIME COMMAND
10428 ? Z 0:00 [bash] <defunct>
Как видите, мой сценарий - зомби-обманщик, но cfn-init
не выполняет системный вызов wait (2) для него.
Когда я запускаю скрипт из командной строки, он корректно завершается.
Я должен предположить, что cfn-init
получает SIGCHLD
.Почему не ждать (2) и двигаться дальше?
Кроме того, есть ли лучший способ исследовать это?Я смотрел на запущенные процессы и читал совершенно бесполезные /var/log/eb-*
журналы.
FWIW, скрипт очень прост:
#!/usr/bin/env bash
mkfifo ~ec2-user/fifo
nohup ~ec2-user/holdlock.sh &
read < ~ec2-user/fifo
И вещь, которую он не делает, довольно проста:
#!/usr/bin/env bash
(echo 'select pg_advisory_lock(43110);';sleep 10m) |
PGPASSWORD=$RDS_PASSWORD psql -h $RDS_HOSTNAME -d $RDS_DB_NAME -U
$ RDS_USERNAME |tee ~ ec2-user / nhlog> ~ ec2-user / fifo