blu*_*blu 2 su upstart amazon-ec2 node.js
我正在使用 upstart 在 Amazon Linux AMI EC2 实例上运行我的 node.js 应用程序。我在让它工作时遇到了一些问题,总结如下。
在我的脚本中,我有这样一行:
exec sudo -u www /usr/local/bin/node /var/www/foo/app.js >> /var/log/foo.sys.log 2>&1
Run Code Online (Sandbox Code Playgroud)
运行时,工作从未通过stop/waiting
,当我打开时,log-priority debug
我看到了这一行:
sudo: sorry, you must have a tty to run sudo
Run Code Online (Sandbox Code Playgroud)
我最后在这篇文章中讨论了visudo
为什么我不应该使用它以及它建议如何使用--session-command
。所以我把这行改成:
exec su --session-command="/usr/local/bin/node /var/www/foo/app.js >> /var/log/foo.sys.log 2>&1" www
Run Code Online (Sandbox Code Playgroud)
日志现在显示(sys) Starting
但initctl status foo
仍然显示foo stop/waiting
。
在这一点上,我不知道该怎么做才能使其正常工作,任何帮助将不胜感激。
更新:我已经看完了SO 的这篇文章,结果是一样的。
问:“我应该如何使用sudo
upstart(或任何其他类型的系统启动/init)脚本?”
答:“你不应该”。
Sudo 确实旨在以交互方式使用(因此出现you must have a tty to run sudo
消息)——它不是用于非交互式启动脚本的正确工具。
做你想做的事情需要一点技巧,因为 Upstart 不支持以非特权用户身份启动工作(但 - 希望有一天他们会解决这个问题)。这个问题是在 SuperUser 上提出并回答的,但我会在这里重现它,因为它对系统管理员同样有价值:
在 freenode 的#upstart 频道上询问,官方对此事的看法是:
Upstart 的未来版本将对此提供本机支持,但现在,您可以使用以下内容:
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters]