【问题标题】:Rundeck different output running scriptsRundeck 不同的输出运行脚本
【发布时间】:2021-01-15 06:12:51
【问题描述】:

感谢您抽出宝贵时间阅读此问题。

我在将脚本运行到 Rundeck 时遇到问题。有以下例子:

#!/bin/bash

SERVICE=$(whereis -b service | awk '{ print $2 }')
MDBC="/etc/mongod.conf"
CHECK=$(ps axu | grep mongod | grep -v grep | wc -l)

if [ $CHECK -eq 0 ]; then
  echo "Restarting MongoDB"
  $(which mongod) -f $MDBC 
  if [ $? -ne 0 ]; then 
    echo "Restart failed. Trigger this job manually."
  else 
    echo "Service restarted."; fi
else
  echo "Service is up and running!"; fi

在服务器本地运行,给出预期的输出:

sudo bash -x test.sh 
++ whereis -b service
++ awk '{ print $2 }'
+ SERVICE=/sbin/service
+ MDBC=/etc/mongod.conf
++ grep -v grep
++ wc -l
++ grep mongod
++ ps axu
+ CHECK=0
+ '[' 0 -eq 0 ']'
+ echo 'Restarting MongoDB'
Restarting MongoDB
++ which mongod
+ /usr/bin/mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 84141
child process started successfully, parent exiting
+ '[' 0 -ne 0 ']'
+ echo 'Service restarted.'
Service restarted.

在 Rundeck 中运行与 script 选项相同的代码,会产生以下结果:

++ awk '{ print $2 }'
++ whereis -b service
+ SERVICE=/sbin/service
+ MDBC=/etc/mongod.conf
++ grep -v grep
++ ps axu
++ wc -l
++ grep mongod
+ CHECK=3
+ '[' 3 -eq 0 ']'
+ echo 'Service is up and running!'
Service is up and running!

如您所见,在第一个输出中,变量 CHECK 的结果等于 0,因为没有 MongoDB 进程正在运行。

第二个输出将CHECK 的值作为3,因此if 条件立即退出。

我的 Rundeck 版本是开源版本 3.3.5

有什么建议吗?

【问题讨论】:

  • 在您的脚本步骤中,您定义了“调用字符串”(如/bin/bash)和“文件扩展名”(如.sh)? (都可以点击“高级”按钮)。
  • 嗨@MegaDrive68k 感谢您的帮助!是的,我已经输入了这些值,结果完全一样。

标签: bash rundeck


【解决方案1】:

测试您的脚本,ps axu | grep mongodb | grep -v grep | wc -l 行似乎不是验证进程是否启动的最佳方法,例如,单独运行该行就像一个魅力,但从 rundeck 脚本步骤调用,另一个进程(bash) 以“mongodb”名称创建和引用(生成两行并始终退出):

user      112156  0.0  0.0   2596   752 pts/1    S+   18:09   0:00 sh myscript.sh
user      112166  0.1  0.2 754928 48196 pts/1    Sl+  18:09   0:00 /path/to/mongodb/binary

也许识别您的服务以重新启动它的最佳方法是(当然您可以改进它):

#!/bin/bash

service docker status | grep 'active (running)' > /dev/null 2>&1

if [ $? != 0 ]
then
    echo "restarting docker"
    sudo service docker restart > /dev/null
    echo "docker restarted"
else
    echo "docker service is running"
fi

在 Rundeck 上看起来像这样job definition

<joblist>
  <job>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <executionEnabled>true</executionEnabled>
    <id>927d0085-c4f8-45c9-ba2c-01575b167c76</id>
    <loglevel>DEBUG</loglevel>
    <name>RestartService</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='node-first'>
      <command>
        <fileExtension>.sh</fileExtension>
        <script><![CDATA[#!/bin/bash

service docker status | grep 'active (running)' > /dev/null 2>&1

if [ $? != 0 ]
then
    echo "restarting docker"
    sudo service docker restart > /dev/null
    echo "docker restarted"
else
    echo "docker service is running"
fi]]></script>
        <scriptargs />
        <scriptinterpreter>/bin/bash</scriptinterpreter>
      </command>
    </sequence>
    <uuid>927d0085-c4f8-45c9-ba2c-01575b167c76</uuid>
  </job>
</joblist>

如果您将服务设置为选项会更好:

<joblist>
  <job>
    <context>
      <options preserveOrder='true'>
        <option name='service' value='docker' />
      </options>
    </context>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <executionEnabled>true</executionEnabled>
    <id>927d0085-c4f8-45c9-ba2c-01575b167c76</id>
    <loglevel>DEBUG</loglevel>
    <name>RestartService</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='node-first'>
      <command>
        <fileExtension>.sh</fileExtension>
        <script><![CDATA[#!/bin/bash

service @option.service@ status | grep 'active (running)' > /dev/null 2>&1

if [ $? != 0 ]
then
    echo "restarting @option.service@"
    sudo service @option.service@ restart > /dev/null
    echo "@option.service@ restarted"
else
    echo "docker service is running"
fi]]></script>
        <scriptargs />
        <scriptinterpreter>/bin/bash</scriptinterpreter>
      </command>
    </sequence>
    <uuid>927d0085-c4f8-45c9-ba2c-01575b167c76</uuid>
  </job>
</joblist>

这两个工作都经过测试和工作,请随意使用或修改它们。

当然,要重新启动进程,您需要sudo 提升和this 插件,如果服务与 Rundeck 在同一台服务器上共存(它是node executor / file copier)或检查this如果是关于外部服务器。

【讨论】:

  • 感谢您的回答。这不是 Rundeck 的错误吗?我的意思是,为什么 Rundeck 要创建另一个名为 mongodb 的进程?据我了解,rundeck 将脚本作为script 发送名称...我按照您的逻辑修改了该行并正常工作,但奇怪的是为什么 Rundeck 无法处理第一个示例中的逻辑。
  • 不是错误,事实上,如果您手动启动与进程名称相同的脚本,则会发生此问题(在验证进程时您将看到两个“MongoDB”字符串),也许 rundeck 在内部做同样的事情(包含 mongodb 命令和 mongodb 命令本身的 bash 调用)。我很高兴知道这已经解决了!
猜你喜欢
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2020-02-07
  • 1970-01-01
相关资源
最近更新 更多