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

什么';这个bash脚本有什么问题(由Foreman使用),bash,foreman,proxylocal,Bash,Foreman,Proxylocal,我需要在开发中运行一个名为Proxylocal的附加进程(这允许外部web服务访问本地机器上的http端点) 为了可靠地执行此操作,我希望将该进程添加到Procfile中。因为这个过程不应该在生产中运行,所以我用它来切换 我的过程文件如下所示: web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb redis: redis-server worker: bundle exec sidekiq proxylocal: bin/proxyl

我需要在开发中运行一个名为Proxylocal的附加进程(这允许外部web服务访问本地机器上的http端点)

为了可靠地执行此操作,我希望将该进程添加到Procfile中。因为这个过程不应该在生产中运行,所以我用它来切换

我的过程文件如下所示:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
redis: redis-server
worker: bundle exec sidekiq
proxylocal: bin/proxylocal
#!/bin/bash
if [ "$RACK_ENV" == "development" ] 
  then
    proxylocal 5000 --host mypersonalmachine
fi
#!/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
bin/proxylocal
看起来是这样的:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
redis: redis-server
worker: bundle exec sidekiq
proxylocal: bin/proxylocal
#!/bin/bash
if [ "$RACK_ENV" == "development" ] 
  then
    proxylocal 5000 --host mypersonalmachine
fi
#!/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
(我从未编写过任何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
更新1 如果我删除
If
语句并将
bin/proxylocal
更改为:

proxylocal 5000 --host mypersonalmachine
那就成功了。那么为什么
if
语句会使一切都变得笨拙呢

更新2 只要$RACK_ENV等于“development”,以下代码就可以工作。我不得不删除
$RACK_ENV
周围的双引号,并将
=
更改为单个
=

if [  $RACK_ENV = "development" ]; then
    proxylocal 5000 --host brojure
fi
然而。。。只要
$RACK_ENV
等同于“开发”,它就可以工作。当它没有的时候,它会窒息

是因为Procfile需要一个进程ID吗? 一位朋友建议,问题可能是Procfile希望从脚本返回一个进程ID。因此,在我们不进行开发的情况下,它没有什么可处理的


有没有一种方法可以让我启动一个零开销的进程,只是为了能够返回一个ID。这很难看,但可能不会太贵……

问题是,当RACK_ENV不是“开发”时,没有进程运行,所以Foreman认为脚本一旦退出就崩溃了

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

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
redis: redis-server
worker: bundle exec sidekiq
proxylocal: bin/proxylocal
#!/bin/bash
if [ "$RACK_ENV" == "development" ] 
  then
    proxylocal 5000 --host mypersonalmachine
fi
#!/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

请注意,David Dollar的回答应该是正确的,正如他给Foreman写的那样。然而,我仍然无法让它工作,因此(无论是好是坏)这就是最终对我起作用的原因:

#程序文件:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
redis: redis-server
worker: bundle exec sidekiq
proxylocal: bin/proxylocal_local
#垃圾箱/原本地垃圾箱

#!/usr/bin/env bash

if [ $RACK_ENV = "development" ]; then
  proxylocal 5000 --host $PROXYLOCAL_HOST 
else
  cat
fi
#环境署署长


还要注意的是,您需要对proxylocal_本地文件进行chmod,以便它是可执行的

bash脚本看起来不错,问题一定出在
proxylocal
调用或配置中。您是否曾经使用您的设置在终端中成功调用过
proxylocal
?@plootox我有,事实上,如果我删除
if
语句,那么它也会正常运行。关于
if
语句的存在导致它失败…我已经测试了你的if测试,它工作得很好。您确定
$RACK\u ENV
的值吗?在测试之前尝试回显它,以查看是否获得正确的状态更改“==”到“=”。查看Bash常见问题:@lihao没关系,shebang是
#/bin/bash
。Bash允许这样的事情发生。谢谢David(也谢谢twitter上的帮助)。正如我在Github上提到的,我在运行这个时仍然有问题——我无法让if语句成功评估。事实上,我最终得到了一个不同的解决方案(可能有很大的缺陷,但确实有效)。我把我的解决方案作为一个不同的答案,但你的答案是正确的,因为你写了Foreman,而我在这里的深度远远超出了我的理解:)