0

对于那些知道你在说什么的人,我为扼杀我将要表达这个问题的方式道歉。我对bash一无所知。有了这个警告,让我拿出我的切肉刀......

我正在构建一个 Rails 应用程序,它具有所谓的 procfile,它设置需要在不同环境中运行的任何进程

例如

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
redis: redis-server
worker: bundle exec sidekiq
proxylocal: bin/proxylocal_local

这些行中的每一行都指定了要运行的进程。它还期望在进程启动后返回一个 pid。语法是

process_name: process_invokation_script

然而,最后一个过程,proxylocal实际上只是开始了一个开发过程。在生产中它什么也没做。

不幸的是,这会导致 Procfile 阻塞,因为它需要返回一个进程 ID。那么是否有一些超级简单、零开销的过程,我可以在这种情况下产生只是为了让 procfile 满意?

4

3 回答 3

4

sleep命令在指定的时间段内不执行任何操作,开销非常低。给它一个比你的代码运行时间更长的参数。

例如

sleep 2147483647

2 31 -1 秒什么都不做,刚刚超过 68 年。我选择这个数字是因为任何合理的实现都sleep应该能够处理它。

万一这不起作用(例如,如果您使用的是不能sleep超过 2 16 -1 秒的旧 16 位系统),您可以sleep在无限循环中执行:

sh -c 'while : ; do sleep 30000 ; done'

这假设您需要该进程运行很长时间;这取决于您的应用程序需要对进程 ID 做什么。如果只要应用程序运行就要求它是唯一的,那么您需要能够持续运行很长时间的东西;如果进程终止,它的 PID 可以被另一个进程重新使用。

如果这不是必需的,您可以使用sleep 0or true,它将立即终止。

如果您需要在进程终止之前给应用程序一点时间来获取进程 ID,则类似sleep 10甚至sleep 1可能会起作用,但确定它需要运行多长时间可能会很棘手且容易出错。

于 2014-08-04T16:25:00.173 回答
1

如果 Heroku 没有做任何事情,proxylocal我不确定你为什么甚至想要在你的 Procifle 中使用它。bin/proxylocal_local对于您是否要更改 Procfile 或要更改的内容以及如何更改,我也有些困惑。

话虽如此,如果您能够为生产做任何您喜欢的事情,您的脚本就可以调用cat它,它会创建一个 pid,然后等待下一个命令(永远不会出现)。

于 2014-08-04T15:44:39.977 回答
0

为了真正减少开销,您不想运行任何外部命令。当 shell 启动一个命令时,它首先分叉自己,然后子 shellexec成为外部命令。如果分叉的孩子可以运行内置,您可以跳过exec.

首先在某处创建一个只读 fifo。

mkfifo foo
chmod 400 foo

然后,每当您需要一个无操作进程时,只需派生一个尝试从 fifo 读取的 shell。它是只读的,所以没有人可以写入它,所以所有读取都会阻塞。

read < foo &
于 2014-08-04T17:25:20.513 回答