我似乎无法弄清楚为什么 supervisord 不会以非 root 用户身份运行。如果我在用户设置为 jason (pid 1000) 的情况下启动它,我会在日志文件中得到以下信息:
2010-05-24 08:53:32,143 CRIT Set uid to user 1000
2010-05-24 08:53:32,143 WARN Included extra file "/home/jason/src/tsched/celeryd.conf" during parsing
2010-05-24 08:53:32,189 INFO RPC interface 'supervisor' initialized
2010-05-24 08:53:32,189 WARN cElementTree not installed, using slower XML parser for XML-RPC
2010-05-24 08:53:32,189 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2010-05-24 08:53:32,190 INFO daemonizing the supervisord process
2010-05-24 08:53:32,191 INFO supervisord started with pid 3444
Run Code Online (Sandbox Code Playgroud)
...然后该过程因某种未知原因而终止。如果我在没有 sudo 的情况下启动它(在用户 jason 下),我会得到类似的输出:
2010-05-24 08:51:32,859 INFO supervisord …Run Code Online (Sandbox Code Playgroud) 如何让 init.d 在启动时启动守护进程到 Ubuntu 上的 coredump?这是我到目前为止所做的......
echo "ulimit -c unlimited" >> /etc/profile
mkdir /corefiles/
chmod 777 /corefiles/
echo "kernel.core_pattern=/corefiles/core.%e.%u.%t" >> /etc/sysctl.conf
echo "fs.suid_dumpable=1" >> /etc/sysctl.conf
echo "kernel.core_uses_pid = 1" >> /etc/sysctl.conf
sysctl -p
Run Code Online (Sandbox Code Playgroud)
这对除了由 init.d 在引导时启动的守护进程之外的所有内容都非常有用。我正在运行 Ubuntu 10.04。我正在寻找一种不涉及编辑每个守护进程 init.d 文件的解决方案。
编辑:另外,以 sudo 启动的守护进程不进行核心转储。
我想使用ssh的ControlMaster功能来共享连接以提高速度。我正在尝试编写脚本,以便我可以启动/重新启动/停止与不同主机的多个连接。
如何确定这些连接中的任何一个是否正在使用中?如果我在 ssh 会话打开时杀死它们,它就会关闭
理想情况下,我的重启脚本看起来像(伪脚本)——停止脚本在底部没有 ssh 命令的情况下是等效的:
for HOST in $HOST_LIST
do
MASTER_PID=`find_master_pid $HOST`
if $MASTER_PID
then
if `find_child_pid`
echo Connection to $HOST in use: not terminating
else
kill -SIGHUP $MASTER_PID
fi
ssh -TMNf $HOST
Run Code Online (Sandbox Code Playgroud) 我有一个 Sinatra 应用程序,我使用ruby app.rb. 通过 ssh 在远程机器上部署它时,如何在后台运行它并将 stdout 和 stderr 重定向到日志文件?
在重新启动时,我想保留以前的日志,以便将较新的消息附加到现有的日志文件中,而不是截断它。
将我的 Web 应用程序作为守护程序运行的推荐方式是什么?
我试过了nohup ruby app.rb &,但似乎缺少 stderr 并且在某些情况下日志语句似乎乱序。
通常日志消息写入 stderr。我想知道拆分日志消息是否是一个好主意/实践,以便错误和警告转到标准错误,而调试/信息/通知消息转到标准输出?或者这是否无关紧要,因为许多专用日志记录进程无论如何只能从 stdin 读取,这需要将 stderr 和 stdout 中的源日志消息组合起来并重定向到记录器的 stdin。
[更新]
下面的两个答案都提到了系统日志,我想我需要详细说明设置。
我询问的守护进程自己在前台运行。守护进程由监督进程管理,例如runit或supervisord。在这两种情况下,守护进程的 stderr 和 stdout 将被监督进程捕获,并且监督进程的工作是决定如何以及在哪里存储日志(可能是系统日志,或者通过 UDP 网络中的其他地方) . 守护进程不必担心写入日志的内容和位置,因为它们只是写入 stdout/stderr。
在 的情况下runit,其日志记录工具svlogd将从其 stdin 中读取重定向的日志消息,这些消息是托管守护进程的 stderr/stdout 组合。至于supervisord,它可以记录 stderr 和 stdout 以分隔日志文件。
因此,在这种特定设置中,在 stderr 和 stdout 之间拆分日志还是仅写入其中一个是一种好习惯?
在决定是独立运行 Jenkins 还是在 Tomcat 中运行时,应该考虑哪些因素?我们宁愿不必使用 Tomcat,因为在这台服务器机器上没有其他需要 Tomcat 的应用程序,所以我们将为 Jenkins 设置和维护另一个应用程序。
但是在 Tomcat 中运行 Jenkins 肯定有一些优势,否则为什么不是每个人都选择独立运行它(因为它更容易设置和维护),那么这些优势是什么?独立运行而不使用 Tomcat 会丢失什么?
Jenkins 安装的大小是否会影响决策?即在一定数量的作业/构建或加载后是否有必要从一个移动到另一个,或者小型和大型 Jenkins 安装对于这两种选择是否同样有效?
Jenkins 独立使用 Winstone servlet 引擎,所以在某些方面这个问题也是关于 Winstone vs Tomcat。
我有一个干净的 Debian 7 安装,我在 /etc/ntp.conf 中手动输入了以下几行:
interface ignore wildcard
interface listen <local_nic_ip>
Run Code Online (Sandbox Code Playgroud)
希望NTP不再监听UDP6,但重启后,它仍然:
5:udp 0 0 <local_nic_ip>:123 0.0.0.0:* 9172/ntpd
6:udp 0 0 127.0.0.1:123 0.0.0.0:* 9172/ntpd
8:udp6 0 0 ::1:123 :::* 9172/ntpd
Run Code Online (Sandbox Code Playgroud)
NTP 的命令行没有显示任何异常:
/usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 121:130
Run Code Online (Sandbox Code Playgroud)
如何阻止 NTP 侦听该 UDP6 端口?
我有一个名为foo. 我的 init 脚本/etc/init.d/foo启动foo守护进程并将其 pidfile 存储在 中/var/run/foo.pid,这似乎是标准位置。因为/etc/init.d/foo必须以 root 身份运行,所以在/var/run.
该foo守护进程是真正的程序/usr/sbin/foo,其目的是由init脚本以root身份调用,但然后立即放弃其权限的非特权foo用户。但是,我还希望该/usr/sbin/foo程序在由于严重错误退出时删除其 pidfile。但由于它已经放弃了它的权限,它不再具有从/var/run目录中删除文件的能力。
我目前的方法是使用seteuid而不是setuid删除我的权限,然后在退出之前立即重新提升权限,以便我可以从/var/run. 但是,我遇到了许多与各种库和外部程序有关的问题,这些问题在使用与 uid 不同的 euid 调用时会出现问题。
有没有其他方法可以做到这一点?我想另一种选择是将我的 pidfile 放在一个目录中,该目录可由 rootfoo用户和用户写入。但是我们其他所有PID文件都在/var/run,包括其运行作为非特权用户,所以我喜欢把其他程序PID文件foo.pid的文件那里。
除了使用之外还有什么方法可以做到这一点seteuid吗?
我正在编写一个 lsb init 脚本(不可否认,我从未从头开始做过)它启动了一个守护进程的 php 脚本。php 脚本是这样开始的:
#!/usr/bin/env php
<?php
/* do some stuff */
Run Code Online (Sandbox Code Playgroud)
然后在 init 脚本中像这样启动:
# first line is args to start-stop-daemon, second line is args to php-script
start-stop-daemon --start --exec /path/to/executable/php-script.php \
-- --daemon --pid-file=$PIDFILE --other-php-script-args
Run Code Online (Sandbox Code Playgroud)
该--daemon标志导致 php 脚本分离并作为守护程序本身运行,而不是依赖于start-stop-daemon分离它。
这就是它(试图)在 init 脚本中停止它的方式:
start-stop-daemon --stop --oknodo --exec /path/to/executable/php-script.php \
--pidfile $PIDFILE
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试通过 init 脚本停止时,它给了我这个:
$ sudo /etc/init.d/my-lsb-init-script stop
* Stopping My Project
No /path/to/executable/php-script.php found running; none killed.
...done.
Run Code Online (Sandbox Code Playgroud)
快速浏览一下ps告诉我,尽管 php …
当我需要在低重要性服务器上启动后台进程时,我倾向于使用 nohup:
nohup ./server.sh &
Run Code Online (Sandbox Code Playgroud)
大多数同事似乎更喜欢屏幕:
screen -D -R mydaemon
./mydaemon.sh
^A ^D
Run Code Online (Sandbox Code Playgroud)
这两种方法的效果有什么主要区别吗?以一种方式或另一种方式有什么好处?