【问题标题】:Exit from bash script but keep the process running退出 bash 脚本但保持进程运行
【发布时间】:2016-03-20 13:55:38
【问题描述】:

我正在运行服务器,需要使用参数执行以下命令。脚本目前运行良好,但问题是当我运行脚本时无法返回控制台。它继续在控制台中运行。如果我强行停止它,那么该过程也将停止。

我想继续运行该进程并返回控制台。

#!/bin/sh
php /home/stjc/app/artisan queue:listen --timeout=60 --tries=5

谢谢

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    在后台运行该进程:

    #!/bin/sh
    (php /home/stjc/app/artisan queue:listen --timeout=60 --tries=5) &
    

    尝试在末尾添加一个&符号(&),并在原始命令的任一侧加上括号。

    编辑:

    : 是一个内置的 shell,这意味着 NOP 取决于您的操作系统,它可能会出现问题尝试在 php 命令中转义它,看看它是否适合您

    #!/bin/sh
    (php /home/stjc/app/artisan queue\:listen --timeout=60 --tries=5) &
    

    强烈建议您同时提供php 解释器的完整路径。

    【讨论】:

    • 我没有看到该命令有任何问题,这可能是由于您可能输入了一些拼写错误或php 代码本身有任何错误。
    • 听起来您使用的是 Windows 编辑器。使用 dos2unix 修复文件,或查看有关此问题的一大堆问题 - 这是一个非常常见的常见问题解答。
    • @tripleee 请多解释,我不使用windows。
    • @AchinthaSamindika : 是一个 shell 命令。你不是在粘贴你的真实代码;否则,您描述的错误将是不可能的。请发布真实代码、真实错误,并在描述配置时包含 PATH 的内容。
    • 与其试图逃避事情,不如简单地引用它,例如'queue:listen'。也就是说,我认为这不是问题所在。 : 不是作为命令以外的特殊字符,所以如果它是参数的一部分,它就可以正常工作。例如,echo foo:bar 有效。
    【解决方案2】:

    您可以使用& at the end of your command 在后台运行进程,或使用nohup 命令将进程与终端完全断开,以便即使在您退出 shell 后它也能继续运行。

    错误: command not found 是一个单独的问题。 : 之前的文本 是环境找不到的命令。由于: 之前没有任何内容,因此您正在尝试启动一个由空字符串组成的命令;这是一个例子:

    $ foo
    -bash: foo: command not found
    $ ''
    -bash: : command not found
    

    这可能是因为您将一个未设置变量用作命令,因此某些东西正试图执行空字符串命令(当然,它不存在)。

    【讨论】:

    • 不,该变量将被忽略。 $baa herebaa 未设置产生 here: command not found
    • @tripleee 但是"$baa" here 将复制该问题。 : 命令确实存在,因此这显然不会导致 OP 的错误消息。
    • 同意冒号命令是红鲱鱼。与此同时,我在上面的评论中支持 CodeGnome。
    【解决方案3】:

    只需在您的命令后附加&,shell 就会在后端运行作业。它将返回类似:[1] 3633.[1] 表示 shell 作业 ID,3633 表示操作系统进程 ID。如果要停止任务,只需键入kill 3633

    #!/bin/sh
    php /home/stjc/app/artisan queue:listen --timeout=60 --tries=5 &
    

    【讨论】:

      【解决方案4】:

      还有一个选项是在后台发送进程,如下所述:

      运行您希望运行的脚本或命令: 例如

      girishp@~$ ping 10.137.108.192
      PING 10.137.108.192 (10.137.108.192) 56(84) bytes of data.
      64 bytes from 10.137.108.192: icmp_seq=1 ttl=64 time=7.18 ms
      64 bytes from 10.137.108.192: icmp_seq=2 ttl=64 time=0.367 ms
      

      命令运行时按Ctrl+Z,会停止运行

      ^Z
      [1]+  Stopped                 ping 10.137.108.192
      

      在终端输入 bg 以恢复在后台执行

       girishp@~$ bg
       [1]+ ping 10.137.108.192 &
       girishp@~$ 64 bytes from 10.137.108.192: icmp_seq=5 ttl=64 time=5.46 ms
       64 bytes from 10.137.108.192: icmp_seq=6 ttl=64 time=4.56 ms
      

      您可以通过在终端中输入fg 再次在前台运行它:

      girishp@~$fg
      ping 10.137.108.192
      64 bytes from 10.137.108.192: icmp_seq=22 ttl=64 time=0.397 ms
      64 bytes from 10.137.108.192: icmp_seq=23 ttl=64 time=3.99 ms
      
      (...)
      

      【讨论】: