我需要一些帮助;无穷无尽的脚本确切地相同——但我似乎无法停止与 upstart 脚本相关的作业。我在 EC2 上使用任何最新的 Ubuntu Elestic AMI,从微型实例到大型实例都是如此。
首先,我提交了一个简单的配置来/etc/init/node-monitor.conf
启动一个进程:
description "node-monitor"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on shutdown
exec sudo -u root sh -c "cd /home/ubuntu/node-monitor/run && /usr/local/bin/node client.js ec2=true debug=false console=true cloudwatch=true >> /var/log/node-monitor.log 2>&1 &"
这对于开始有效:
sudo start node-monitor
node-monitor start/running, process 1580
但没有停止:
sudo stop node-monitor
stop: Unknown instance:
然后我尝试了一些更复杂的东西,基于另一个 node.js 项目:
description "node-monitor"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on shutdown
script
echo $$ > /var/run/node-monitor.pid
exec sudo -u root sh -c "cd /home/ubuntu/node-monitor/run && /usr/local/bin/node client.js ec2=true debug=false console=true cloudwatch=true >> /var/log/node-monitor.log 2>&1 &"
end script
pre-stop script
rm /var/run/node-monitor.pid
end script
但这也不起作用。我到底做错了什么?
答案1
首先,新贵们全部以 root 身份执行作业,因此您不需要 sudo,摆脱它。
其次,您监控的程序似乎正在退出,因此出现“未知实例”错误。您应该在 /var/log/syslog 中看到一些信息,告诉您该进程已退出。您可以添加单词“respawn”,upstart 将尝试重新启动它,但如果它继续快速退出,upstart 最终将放弃。
您以 & 结束该行,这意味着“在后台运行此程序”。鉴于此,upstart 将看到您的 shell 退出(因为作业控制在非交互式 shell 中不活动,& 将有效地守护任何作业)。如果您希望 upstart 保持此进程运行,并且能够终止它,请删除 &。
此外,您的启动时间太明确,而您的停止时间则基于不存在的事件。您可以直接在运行级别 [2345] 上启动,在运行级别 [^2345] 上停止,这将有助于您的工作在 Ubuntu 不断发展的后续版本中更好地工作。从 Ubuntu 11.10 开始,这也意味着它将在之后启动全部网络接口已启动,而不仅仅是 eth0。
更有趣的是,您可以使用“chdir”节,这样您根本不必使用 shell。
因此原始作业最好写成:
start on runlevel [2345]
stop on runlevel [^2345]
respawn
chdir /home/ubuntu/node-monitor/run
exec /usr/local/bin/node client.js ec2=true debug=false console=true cloudwatch=true >> /var/log/node-monitor.log 2>&1
作为加分项,当 Ubuntu 12.04 发布时,您可以使用新的“控制台日志”功能并取出 >> /var/log/node-monitor.log ,尽管它会写入 /var/log/upstart/node-monitor.log 。
最后,不再有实际的“alestic”AMI。Eric Hammond 保留了一张相同的 AMI ID 表,这些 ID 列在https://cloud-images.ubuntu.com.. 比较http://alestic.com到http://cloud-images.ubuntu.com/query/lucid/server/released.current.txt例如。