【问题标题】:Run current bash script in background在后台运行当前 bash 脚本
【发布时间】:2015-08-03 17:04:31
【问题描述】:

通常我会在背景中添加“&”字符来开始我的流程,例如:

user@pc:~$ my_script &

但是如何在没有“&”字符的情况下在后台制作它?

#!/bin/bash

#What can I add here to hide current process ($$) and to release focus ?

start_server()
{   
    #my script here with infinite loop ...
}

谢谢大家。

【问题讨论】:

  • 也许使用了一个shell脚本?看到这个问题:stackoverflow.com/questions/3430330/…
  • & 将在后台运行任务但后台任务不等于守护进程。它仍然连接到您启动它的终端。关闭终端后,进程将收到SIGHUP 并死亡。您可以使用nohup 命令或bash 的内置作业控制disown 来防止这种情况发生。但是,当您想使用disown 时,必须先将进程发送到后台
  • 顺便说一句,一般来说,这是运行服务的错误方式。考虑使用操作系统的进程监控系统——在 MacOS 上启动,在 Ubuntu 上启动,在 Fedora 和 RHEL/CentOS 7 上使用 systemd——或者安装你选择的一个; DJB 的 daemontools 及其 BSD 许可的 clone runit 是不错的选择,可以在任何符合 POSIX 的操作系统上运行,而无需替换 init。
  • @CharlesDuffy 在 Ubuntu (14.10) 上,它也已经是 systemd 了。他们整合它的速度真的很快,我很惊讶。顺便说一句,在基于 Debian 的系统上,您可以使用 start-stop-daemon,它是 dpkg 软件包的一部分,这意味着它始终被安装。恕我直言,确实有一个用例,您想启动一个守护程序但不希望init 控制它。 start-stop-daemon 会做到的。

标签: bash


【解决方案1】:
#!/bin/bash

if [[ "$1" != "--nodaemon" ]]; then
    ( "$0" --nodaemon "$@" </dev/null &>/dev/null & )
else
    shift
fi

#...rest of script

它的作用是检查它的第一个参数是否为“--nodaemon”,如果是,则在后台使用参数“--nodaemon”自行触发("$0"),这将阻止它试图在一种无限循环中重新设置自己的背景。

请注意,将此作为脚本中的第一件事会使其始终在后台自行运行。如果它只需要在某些条件下(例如使用参数“start”运行时)进入后台,则必须相应地进行调整。也许是这样的:

#!/bin/bash

start_server()
{   
    #my script here with infinite loop ...
}

if [[ "$1" = "start" ]]; then
    ( "$0" start-nodaemon </dev/null &>/dev/null & )
elif [[ "$1" = "start-nodaemon" ]]; then
    start_server
elif #.....

【讨论】:

  • 这如何回答这个问题?
  • 我放置了 : ( "$0" start-nodaemon /null &>/dev/null & ) 但仍然无法正常工作。
  • @hek2mgl 它使脚本自我守护进程。使用一个体面的流程主管(正如您和 Charles Duffy 建议的那样)是一个更好的选择如果一个人可用并且适合该目的;我只是按要求回答问题。
  • @M.LAKHDARI 需要根据您运行脚本的方式调整 sn-p。如果您希望我进行改编,您必须提供有关脚本如何运行的更多信息。 (或者,如果有可用的流程管理器,只需放弃这种方法并改用它。)
  • @GordonDavisson 我的 start_server() 函数真的不重要,我只进行培训,我所需要的只是在后台运行我的脚本,从脚本本身开始。有可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多