这个bash脚本有什么问题(由Foreman使用)

时间:2014-08-04 10:03:15

标签: bash foreman proxylocal

我需要在开发中运行一个名为Proxylocal的额外进程(这允许外部Web服务在本地计算机上访问http端点)。

为了可靠地执行此操作,我想将该过程添加到我的Procfile中。由于该过程不应在生产中运行,因此我使用this technique进行切换。

我的Procfile如下所示:

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

bin/proxylocal看起来像这样:

#!/bin/bash
if [ "$RACK_ENV" == "development" ] 
  then
    proxylocal 5000 --host mypersonalmachine
fi

(我从来没有做过任何bash脚本,所以不知道这是否是正确的语法 - 我只是复制了它)。

然而,每次运行foreman start时,它都会立即退出,只出现以下错误:

10:57:25 proxylocal.1 | started with pid 14935
10:57:25 proxylocal.1 | exited with code 0
10:57:25 system       | sending SIGTERM to all processes

UPDATE1

如果我删除了if语句并将bin/proxylocal更改为:

proxylocal 5000 --host mypersonalmachine

然后这确实成功。那么为什么if陈述会使一切变得无足轻重?

更新2

只要$ RACK_ENV等于"开发",以下代码就可以正常工作。我必须删除$RACK_ENV周围的双引号,并将==更改为单=

if [  $RACK_ENV = "development" ]; then
    proxylocal 5000 --host brojure
fi

然而......只有在$RACK_ENV等同于“开发”时,它才有效。当它没有窒息时。

是因为Procfile需要进程ID吗?

一位朋友建议问题可能是Procfile期望从脚本返回进程ID。因此,在我们不进行开发的情况下,它无需处理任何事情。

有没有办法可以启动零开销流程,只是为了能够返回ID。它很难看,但可能不太昂贵......

2 个答案:

答案 0 :(得分:0)

问题是,当RACK_ENV不是"开发"没有进程运行,因此Foreman假定脚本一旦退出就崩溃了。

这里正确的做法是创建一个" web"在开发中运行代理的包装器脚本。像这样:

#!/usr/bin/env bash

cleanup() {
  kill $proxy_pid
}

if [ "$RACK_ENV" == "development" ]; then
  proxylocal 5000 --host $PROXY_HOST &
  proxy_pid=$(cat thepidfile)
  trap cleanup EXIT
fi

bundle exec unicorn -p $PORT -c ./config/unicorn.rb

答案 1 :(得分:0)

请注意David David的回答应该是正确的,因为他写了Foreman。但是我仍然有问题让它工作,所以(无论好坏)这最终对我有用:

#Procfile:

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

#bin / proxylocal_local

#!/usr/bin/env bash

if [ $RACK_ENV = "development" ]; then
  proxylocal 5000 --host $PROXYLOCAL_HOST 
else
  cat
fi

#.env

PROXYLOCAL_HOST=hostname_you_want_to_use

另请注意,您需要chmod proxylocal_local文件以使其可执行。