Bash:如何获取脚本以将其自身作为后台任务重新运行?

詹姆斯·高

我正在编写旨在用作守护程序的Bash脚本。如果我的脚本用户未将--sync选项传递给脚本,则我希望脚本使用该选项作为后台任务重新运行。这是我的代码(此SO帖子的最后一部分被盗):

#!/usr/bin/env bash

args=("$@") # capture them here so we can use them if --sync's not passed
async=true

while [ $# -gt 0 ]
do
    case "$1" in
        --sync)
            async=false
            ;;
        # other options
    esac
    shift
done

# if --sync isn't passed, rerun the script as a background task
$async && exec nohup "${BASH_SOURCE[0]}" --sync "${args[@]}" 0<&- &> /dev/null &

由于某些原因,它似乎没有用。当我这样做bash -x myscript(这有助于调试脚本)时,即使它$async为true,它似乎仍会继续运行,我认为这不会发生,因为exec通常会停止执行。

同样,如果我从终端运行以下命令:

exec nohup true 0<&- &> /dev/null &

即使使用,它也无法退出外壳exec为什么会这样,我应该怎么做才能解决?(加分点:是否可以在创建子shell的情况下执行此操作?)

谢谢。

&被施加到所述exec命令本身,所以exec foo &派生一个新的异步子外壳(或与其等同的,见下文)。该subshel​​l立即用替换foo如果您还希望父级(即脚本)终止,则需要使用exit命令明确终止

exec很可能不会在这里买你什么。Bash足够聪明,它实际上没有为简单的后台命令启动子shell。因此,这样做应该足够了:

if $async; then
  nohup "${BASH_SOURCE[0]}" --sync "${args[@]}" 0<&- &> /dev/null &
  exit 0
fi

我不知道没有子shell就能做到这一点。但是,当您编写shell脚本时,会得到子shell。就我个人而言,我只是使用一个简单的变量,并用类似的方法测试它,if [[ $async ]];而不是执行trueor false,但是由于它们也是bash内置函数,因此相当等效。在其他Shell中,它们可能在子Shell中运行。

现在我想到了,由于您仍然要在异步执行中重新处理所有选项case,因此不妨语句内进行分叉和退出操作,因此根本不需要进行第二次检查:

case "$1" in
    --sync)
        nohup "${BASH_SOURCE[0]}" --sync "${args[@]}" 0<&- &> /dev/null &
        exit 0
        ;;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Swift中将后台任务作为循环运行

来自分类Dev

在执行后台任务的脚本上执行bash命令替换

来自分类Dev

在执行后台任务的脚本上执行bash命令替换

来自分类Dev

如何安排功能作为后台任务进行操作

来自分类Dev

Ansible:从失败的任务重新运行剧本

来自分类Dev

启动后台脚本以运行任务然后退出

来自分类Dev

如何检查是否正在运行任何后台任务?

来自分类Dev

如何获取bash脚本以将自身回显到新文件中?

来自分类Dev

启动时运行后台任务

来自分类Dev

iOS App运行后台任务时间

来自分类Dev

从HTTP请求运行后台任务

来自分类Dev

在javascript中运行“后台任务”

来自分类Dev

在启动时运行后台任务

来自分类Dev

RedirectToAction之后运行后台任务

来自分类Dev

使用Quartz Scheduler运行后台任务

来自分类Dev

多个长期运行的后台任务

来自分类Dev

后台任务会永远运行吗?

来自分类Dev

Sonarqube 后台任务永远运行

来自分类Dev

Bash上的后台任务的说明

来自分类Dev

在Azure Pipelines中,如何在其他任务运行时执行后台任务?

来自分类Dev

如何在列表中分别获取Windows任务和后台任务?

来自分类Dev

如何返回后台任务在前台?

来自分类Dev

如何批量启动后台任务?

来自分类Dev

当我运行`./command.sh&`时,后台任务被挂起。如何保持其运行?

来自分类Dev

如何创建(通过安装程序脚本)将安装我的bash脚本以使其在DE启动时运行的任务?

来自分类Dev

如何使用MPI_Irecv执行后台任务并作为中断通知?

来自分类Dev

如何在PHP Web应用程序中运行后台任务?

来自分类Dev

javafx:当从“可观察列表”中删除对象本身时,如何停止对象的后台任务运行?

来自分类Dev

如何创建一个永远运行的后台任务-Python FlaskSQLAlchemy

Related 相关文章

  1. 1

    在Swift中将后台任务作为循环运行

  2. 2

    在执行后台任务的脚本上执行bash命令替换

  3. 3

    在执行后台任务的脚本上执行bash命令替换

  4. 4

    如何安排功能作为后台任务进行操作

  5. 5

    Ansible:从失败的任务重新运行剧本

  6. 6

    启动后台脚本以运行任务然后退出

  7. 7

    如何检查是否正在运行任何后台任务?

  8. 8

    如何获取bash脚本以将自身回显到新文件中?

  9. 9

    启动时运行后台任务

  10. 10

    iOS App运行后台任务时间

  11. 11

    从HTTP请求运行后台任务

  12. 12

    在javascript中运行“后台任务”

  13. 13

    在启动时运行后台任务

  14. 14

    RedirectToAction之后运行后台任务

  15. 15

    使用Quartz Scheduler运行后台任务

  16. 16

    多个长期运行的后台任务

  17. 17

    后台任务会永远运行吗?

  18. 18

    Sonarqube 后台任务永远运行

  19. 19

    Bash上的后台任务的说明

  20. 20

    在Azure Pipelines中,如何在其他任务运行时执行后台任务?

  21. 21

    如何在列表中分别获取Windows任务和后台任务?

  22. 22

    如何返回后台任务在前台?

  23. 23

    如何批量启动后台任务?

  24. 24

    当我运行`./command.sh&`时,后台任务被挂起。如何保持其运行?

  25. 25

    如何创建(通过安装程序脚本)将安装我的bash脚本以使其在DE启动时运行的任务?

  26. 26

    如何使用MPI_Irecv执行后台任务并作为中断通知?

  27. 27

    如何在PHP Web应用程序中运行后台任务?

  28. 28

    javafx:当从“可观察列表”中删除对象本身时,如何停止对象的后台任务运行?

  29. 29

    如何创建一个永远运行的后台任务-Python FlaskSQLAlchemy

热门标签

归档