我有一个程序(预编译的二进制文件),在 Linux 上手动启动时运行良好。它有一个 CLI,我用它来输入命令。这个程序是一个软件路由器,我可以连接到它的 CLI 来调整它的设置。
但是,如果我想在启动时启动它,程序会运行得很慢,无法使用。例如,如果有信息被打印到屏幕上,它将被分块打印出来,就好像波特率很慢一样。我输入的每个命令都是这样,信息打印得很慢。
可能会发生什么,与我在启动后手动运行它而不是使用 S99 或其他东西运行 init.d 有什么不同?如果我停止该过程并手动重新启动它,它就可以正常工作。
这个 python 脚本是从 init.d 调用的:
import subprocess
application_pidfile = "/var/run/application.pid"
command_line=["start-stop-daemon", "-q", "-p", application_pidfile, "-S",
"-m", "-b", "-x", "/bin/application"]
subprocess.call(command_line)
我想知道为什么启动后一个小时仍然很慢?但是,如果我只是停止它并手动启动它,即使启动后几秒钟它也能正常运行?即使我设置了延迟,例如在启动后几分钟启动此过程,也会出现相同的问题。
它是否会以某种缓慢的“套接字”模式或其他模式启动?
答案1
现代 init 系统(例如 systemd 和 upstart)运行多个执行线程,即使使用原始 init,事情也可能在引导过程中分叉(例如,您已经说过您的系统确实如此)。
这意味着您的进程与其他进程同时运行,并且任何输出都将与它们的输出交错:
Process 1 says "I'm here"
Process 2 says "I'm here"
Process 1 says "Doing my thing..."
Process 3 says "I'm here"
Process 3 says "Doing my thing..."
Process 1 says "Still busy..."
Process 2 says "Doing my thing..."
请注意,此处的顺序是随机的,超出了启动优先级;遗嘱S05
开始在一个S70
过程之前,但它们相对于彼此何时完成是不确定的,除非一个过程的完成是另一个过程的特定先决条件。
如果您曾经做过任何线程编程,您就会熟悉这种赛马。因为进程是同时运行的,所以它们不会以有序的方式交错——因此在我的示例中,Process 3
在较早启动的进程执行相同操作之前,需要先执行几项操作。等等。这只是偶然,每次都不会一样。
开机是系统繁忙的时间——许多事情同时活跃地发生。因此,如果将执行时间与随后单独运行该进程进行比较,它会更慢,因为在后一种情况下,它不必与许多(或者,更重要的是,任何)其他活动进程竞争。