我有一个 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
它 nohups 的事情非常简单:
#!/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