我必须编写自己的 CentOS init.d 脚本芹菜因为它只为 Debian 提供了一个。您可以看到我在回答自己的堆栈溢出问题时编写的脚本3989656。
但这个脚本有一个问题。如果我调用它:
sudo service celeryd start
然后我需要在完成后按 Enter 键以获得 shell 提示。这是一个问题,因为我想通过 ssh 从另一台机器调用它,方法是:
ssh 192.168.2.3 sudo service celeryd start
并且 ssh 永远不会返回。 (我用织物启动和停止远程服务,这会挂起它,因为它调用了上面的 ssh 命令)。
什么会导致此行为,以及如何在脚本中修复它?
请注意,如果我按照 Thomas Themel 在评论中的建议执行“sh -x /etc/init.d/celeryd”,则输出为:
runuser -s /bin/bash - apache -c 'ulimit -S -c 0 >/dev/null 2>&1 ; /usr/local/django/portalapps/manage.py celeryd --pidfile /var/run/celery.pid -f /var/log/celeryd.log -l INFO'
我不明白 /etc/init.d/functions 中的守护进程函数(这就是产生这一系列 bash 命令的函数)实际上是如何守护进程的。
答案1
您可能实际上有一个 shell 提示符,但没有意识到。如果您有一个程序在后台写入终端,您的提示符会被掩盖,但它仍然可以输入。
测试.sh:
#! /bin/sh
echo -e "This is a test\n\n"
交互式外壳:
$sh test.sh &
$This is a test
_
在这个例子中,有提示。您会在提示符“This is a test”之前看到“$”。在底部您可以看到等待输入的光标。如果您在此处键入命令并按 Enter 键,它将照常工作。尝试ls
在启动守护程序之后但在按之前运行<enter>
。
答案2
您可能想通过首先使用 (sudo 根据需要) 直接运行 /etc/init.d 脚本来弄清楚到底是什么吃掉了该返回sh -x /etc/init.d/celeryd start
。如果是在 shell 脚本中,你应该这样看。如果daemon
它本身在返回之前等待换行符,那么您的答案将是 celeryd 特定的,并且可能会受益于运行它strace
或简单地< /dev/null
附加一个,以便它无法通过您的终端访问标准输入。
另一种“在黑暗中摸索”的尝试:ssh
使用-nt
禁用终端分配和标准输入的选项运行。
答案3
遇到了完全相同的问题 - 你的问题和调查实际上帮助我找到了答案。
开始芹菜celery_detach
- 然后,噗!事情有效!
IE。manage.py celery_detach --params --settings=foo
它会立即返回,并带有适当的换行符以及结构正在寻找的东西。
答案4
该daemon
命令是否需要&
在末尾。我认为不会。这可能是您问题的根源。