【问题标题】:My shell script does not see environment variable changes我的 shell 脚本没有看到环境变量的变化
【发布时间】:2017-09-08 00:32:53
【问题描述】:

我有一个 bash 脚本,它永远循环并在其中检查环境变量以查看它是否应该运行 php yii process-queue。顺便说一下,这个脚本是 docker 容器的命令,PID 1 也是。

来自ps aux的输出:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  19720  3340 ?        Ss   09:26   0:00 /bin/bash /var/www/hub/process-queue-runner.sh
root       293  0.0  0.0  19936  3664 ?        Ss   09:28   0:00 /bin/bash
root      1927  0.0  0.0   6012   648 ?        S    09:42   0:00 sleep 0.5
root      1928  0.0  0.0  36092  3164 ?        R+   09:42   0:00 ps aux

当我从命令行运行 export RUNPROCQ=true 时,我希望循环开始运行 php yii process-queue 但它没有 - 有没有可以在我的 bash 脚本中运行的命令,以便它可以看到 RUNPROCQ 环境变量值变化?

我的 bash 脚本名为 process-queue-runner.sh:

#!/bin/bash

while :
do
    if [[ ${RUNPROCQ} != "false" ]]; then
        php yii process-queue
    fi
    sleep 0.5
done

这是 docker-compose.yml 文件中的相关部分:

procq:
  image: hub_ui:latest
  environment:
    ENV: qa1
    RUNPROCQ: "false" # this is to stop the proc q from running straight away - the refresh_db.sh script will set this to true once it has finished loading the fixtures
  links:
   - db:local.database.hub
   - cache:local.cache.hub
  command: /var/www/hub/process-queue-runner.sh

【问题讨论】:

  • 你是如何执行脚本的?
  • @Inian 这是 docker 容器的命令 - 我已将相关的 docker-compose.yml 部分添加到我的问题中。
  • 问题在于在子 shell 中运行的脚本的 执行,没有反映您对环境变量的更改。也许认为您可以source它?
  • 我设法让它像这样运行:root 1 0.0 0.0 19720 3272 ? Ss 10:12 0:00 /bin/bash -c source /var/www/hub/process-queue-runner.sh 但是更改 env 变量值仍然没有任何作用......
  • 我最终只是创建和删除了一个隐藏文件并测试了该文件是否存在。不理想,但它适用于较小的磁盘 i/o 开销。

标签: linux shell environment-variables


【解决方案1】:

你的脚本很好。

$ export RUNPROCQ=true
$ ./ba.sh
php yii process-queue
php yii process-queue
php yii process-queue
php yii process-queue
^C
$ cat ba.sh 
while :
do
    if [[ ${RUNPROCQ} != "false" ]]; then
        echo php yii process-queue
    fi
    sleep 0.5
done

【讨论】:

    【解决方案2】:

    用户 supervisord 并忘记这个手动脚本。 主管可以抓取所有日志并监控进程

    supervisord

    【讨论】:

      【解决方案3】:

      它不会那样工作,因为您在父 shell 中设置了 RUNPROCQ 变量,而您的脚本将无法读取它。也许你应该在 process-queue-runner.sh 中尝试这样的事情:

      #!/bin/bash
      while :
      do
          source /tmp/.myvars
          if [[ ${RUNPROCQ} != "false" ]]; then
              php yii process-queue
          fi
          sleep 0.5
      done
      

      refresh_db.sh中添加:

      RUNPROCQ="true"
      #or
      RUNPROCQ="false"
      #...
      echo RUNPROCQ="$RUNPROCQ" > /tmp/.myvars
      

      【讨论】:

      • 谢谢!您的解决方案比我使用的解决方案更优雅,尽管它以相同的方式解决了问题 - 使用磁盘作为读取/写入内容的常用场所。我只是使用隐藏文件的存在来确定是否运行命令。感谢您的反馈。
      猜你喜欢
      • 2013-09-16
      • 1970-01-01
      • 2013-09-04
      • 2014-08-03
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多