使用 if/else 语句在 shell 中运行命令

使用 if/else 语句在 shell 中运行命令

我想在 shell 中运行一个命令(基本上通过 ansible playbook),条件是,如果 ps 状态给出非零退出代码,则需要运行另一个命令。我不想将其拆分为两个任务,一个用于检查 ps 状态,另一个用于执行命令。相反,使用 if/else 条件,可以将其合并为单个任务吗?

ps -ef | grep -v grep | grep httpd

如果上述命令以非零状态退出,则我需要触发下面给出的另一个命令。我如何将这两个命令合并为一个并将其作为单个任务包含?

nohup /root/scripts/httpd.sh start &

答案1

解决方案

这会实现你想要的效果:

  tasks:
    - name: pser
      shell: ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &

笔记:我正在使用该命令sleep 1000作为 Apache 守护进程的替代品httpd

示例运行

$ cat pb.yml
- name: Hello Ansible - quick start
  hosts: all
  connection: local

  tasks:
    - name: pser
      shell: ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &

请注意,我们既没有 sleep 进程,也没有 httpd 进程:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
$

现在我们运行剧本:

$ ansible-playbook -i inventory pb.yml

PLAY [Hello Ansible - quick start] *************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [pser] ************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

现在我们正在进行睡眠过程:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34422     1   0  2:00AM ttys000    0:00.00 /bin/bash -c ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &
  501 34425 34422   0  2:00AM ttys000    0:00.00 sleep 1000

现在,如果我们重置并做同样的事情,但这次打开一个编辑窗口,文件名为httpd“伪造” grep [h]ttpd

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34542     1   0  2:02AM ??         0:00.27 /usr/local/Cellar/macvim/HEAD-4e631a0/MacVim.app/Contents/bin/../MacOS/Vim -f -g httpd

这次运行剧本不会做任何事情:

$ ansible-playbook -i inventory pb.yml

PLAY [Hello Ansible - quick start] *************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [pser] ************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

仍然只是我们的编辑窗口,其中打开了“httpd”文件:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34542     1   0  2:02AM ??         0:00.27 /usr/local/Cellar/macvim/HEAD-4e631a0/MacVim.app/Contents/bin/../MacOS/Vim -f -g httpd

相关内容