为什么我需要在 init.d 脚本完成后按 Enter 键才能获取 shell 提示符?

为什么我需要在 init.d 脚本完成后按 Enter 键才能获取 shell 提示符?

我必须编写自己的 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命令是否需要&在末尾。我认为不会。这可能是您问题的根源。

相关内容