我正在使用 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 的这篇文章,结果是一样的。
我正在尝试设置 Tomcat 以从新贵开始。我发现以下作品:
description "Tomcat Server"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 10 5
setuid tomcat
env JAVA_HOME=/usr/lib/jvm/default-java
env CATALINA_HOME=/opt/apache-tomcat-7.0.34
script
chdir $CATALINA_HOME
exec $CATALINA_HOME/bin/catalina.sh run
end script
Run Code Online (Sandbox Code Playgroud)
但是如果我删除chdir,tomcat 会启动,但是FileNotFound当我.wars加载时有很多例外。(也就是说:.wars它们自己确实加载了但它们在加载时抛出异常。)
请注意,此行为与我从命令行调用时所看到的不同catalina.sh。从命令行调用,我可以/opt/apache-tomcat-7.0.34/bin/catalina.sh run 从任何目录(没有 chdiring)运行,一切都很好。
那么为什么chdir在我的新贵脚本中是必要的呢? (新贵环境与我的命令行环境有何不同?)
我不使用 chdir 时看到的错误示例:
Feb 22, 2013 3:00:11 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive my-war.war
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: my-war.log …Run Code Online (Sandbox Code Playgroud) 我设置了以下新贵脚本:
# autossh
description "autossh connections"
start on started dbus
stop on (runlevel [06] or stopped dbus)
respawn
respawn limit 5 60 # respawn max 5 times in 60 seconds
script
export AUTOSSH_PIDFILE=/var/run/autossh.pid
export AUTOSSH_POLL=60
export AUTOSSH_FIRST_POLL=30
export AUTOSSH_GATETIME=0
export AUTOSSH_DEBUG=1
exec sudo -H -u pi -s autossh -M 0 \
-R remoteport:127.0.0.1:localport remoteuser@remote.host
exec sudo -H -u pi -s autossh -M 0 \
-R remoteport2:127.0.0.1:localport2 remoteuser@remote.host
end script
Run Code Online (Sandbox Code Playgroud)
但每次启动后我都会收到此错误消息:
ssh 提前退出,状态为 0
我该如何修复它?
谢谢
When I'm running Celery with Upstart, after a while, the child processes or the main processes die without any trace.
The Upstart script I'm using (/etc/init/celery):
description "celery"
start on runlevel [2345]
stop on runlevel [!2345]
kill timeout 20
# console log
setuid ***
setgid ***
script
chdir /opt/***/project/
exec /opt/***/virtualenvs/***/bin/python manage.py celery worker --settings=settings.staging -B -c 4 -l DEBUG
end script
respawn
Run Code Online (Sandbox Code Playgroud)
When running exectly the same command without upstart (manually running the exec part), everything works …
我正在使用以下/etc/init/jsonlog.conf新贵工作:
description "jsonlog"
start on runlevel [23]
stop on runlevel [06]
respawn
script
cd /tmp
echo "about to listen"
/bin/nc -l 3333
echo "finished listening"
end script
post-stop script
sleep 1
end script
Run Code Online (Sandbox Code Playgroud)
问题是nc每次客户端连接时都会立即退出。
所需的行为是接收到的所有数据(即 utf8 json)应以/var/log/upstart/jsonlog.log. 该服务器运行的是 Ubuntu 12.04LTS。
nc从 bash shell 运行时该命令可以正常工作。
我假设这与stdin. 我尝试过使用一个-q -1选项,但没有帮助。
PS 我很满意这样一个事实,即它一次只会听一个客户。
我在我的一台 Ubuntu 服务器上托管了几个 Django 站点。直到最近,我一直在使用 Cherokee HTTPd,它可以选择启动后端应用程序,如 Django 站点,但我刚刚切换到 nginx。
在 cherokee 下,我只是“运行”Django 站点(站点存储在 中/web/):
cd /web/mywebsite/; python manage.py runfcgi workdir=/web/mywebsite method=threaded socket=/web/mywebsite/sock pidfile=/web/mywebsite/pid maxspare=3 maxrequests=500
Run Code Online (Sandbox Code Playgroud)
然后我将连接到/web/mywebsite/sock. Cherokee 也以我选择的用户身份运行它,就我而言www-data。
在 Cherokee 下,这种方法对我很有效,但现在我要转向 nginx,我手头上没有什么东西可以进行流程管理。
环顾四周,实际上有数百种不同的管理方式。初始化脚本、cron 检查、daemontools。但是当我在 Ubuntu 上(可能永远都是)Upstart 似乎是有道理的......但我从哪里开始呢?
有人能给我一个新贵脚本的例子,它运行上面的脚本并且如果它死了会重新生成它吗?
我有几个 django 站点/web/(它们是该目录中唯一的目录)所以如果有一种欺骗方式我可以让这个新贵脚本启动它们(使用相同的设置)并监视它们,那就是超级超级棒。
我将如何在 CentOS 6 中用自定义脚本替换 TTY。CentOS 6 使用 upstart 而不是标准的 SysV init 脚本,所以我很难弄清楚它是如何工作的。
通常(在 SysV init 脚本中),我会编辑 /etc/inittab 并用我的脚本替换 mingetty 行之一,如下所示:
1:2345:respawn:/root/myscript tty1
Run Code Online (Sandbox Code Playgroud)
但是,对于 Upstart,此文件没有相关行,因此我不确定如何完成此操作。
当我有一个像这样的暴发户脚本时..
exec start-stop-daemon --exec /tmp/test.sh --background --start
Run Code Online (Sandbox Code Playgroud)
我想将pid文件保存在某个地方,然后将其用于stopor restart,对吧?
那么默认创建的pid文件在哪里呢?
我有一个需要停止服务的小 shell 脚本。这需要在 ubuntu (14.04)、debian 和 Arch 上工作。现在我所做的类似于
case $(cat /etc/issue) 在
*Ubuntu*)
服务命令
*Debian*)
/etc/init.d/servicename 命令
*拱*)
systemctl 服务命令
esac
有没有更好的方法来做到这一点?