通过 bash 在 linux 中生成一个完全独立的进程
Posted
技术标签:
【中文标题】通过 bash 在 linux 中生成一个完全独立的进程【英文标题】:spawn an entirely separate process in linux via bash 【发布时间】:2011-02-13 11:10:05 【问题描述】:我需要让脚本执行(bash 或 perl 或 php,任何都可以)另一个命令然后退出,而另一个命令仍然运行并自行退出。我可以通过 at 命令进行安排,但很好奇是否有更简单的方法。
【问题讨论】:
是否可以通过 cron 进行调度? 您可能希望详细说明您的需求,因为正确的答案可能取决于它... (1) 什么进程或用户操作将启动脚本? (2) 为什么要一个脚本而不是直接启动命令? (3) 您是否需要记录输出、从终端分离和/或为命令启动一个新的进程组? (4) 还有其他的 cmets 吗? 【参考方案1】:#!/bin/sh
your_cmd &
echo "started your_cmd, now exiting!"
perl 和 php 存在类似的结构,但在 sh/bash 中很容易在后台运行另一个命令并继续。
编辑
通用进程操作的一个很好的来源是/etc/init.d
下的所有启动脚本。他们会做各种巧妙的技巧,例如跟踪 pid、执行基本的启动/停止/重启命令等。
【讨论】:
与此相关的一件事让我感到震惊 - 你不能这样做... [ $var -eq 1 ] && your_cmd & ...因为父进程将继续运行。 您可能需要使用nohup
来防止your_cmd
在退出shell 后死亡;见 camh 的回答。【参考方案2】:
要在后台运行命令,您可以在命令后附加一个“&”。
如果您需要该程序在您的登录会话后持续运行,您可以使用nohup。
查看类似的 *** 讨论:how to run a command in the background ...
【讨论】:
【参考方案3】:在您注销时运行命令并使其继续运行的常用方法是使用nohup(1)
。 nohup
阻止给定命令在 shell 退出时接收 HUP 信号。您还需要使用 & 号命令后缀在后台运行。
$ nohup some_command arg1 arg2 &
【讨论】:
【参考方案4】:&
?
【讨论】:
你是如何得到一只四角独角兽,头上有四个角的? 它是一只角,但它站在彩虹的前面。【参考方案5】:我不完全确定这是否是您要查找的内容,但您可以通过在命令的最后一个字符附加与号 (&) 符号来后台执行在 shell 中执行的进程。
所以如果你有脚本,a.sh
而 a.sh 需要产生一个单独的进程,比如执行脚本 b.sh,你会:
b.sh &
【讨论】:
【参考方案6】:只要你提到 Perl:
fork || exec "ls";
...其中“ls”是任何东西。根据需要重复执行尽可能多的命令。
【讨论】:
或者,如果不需要当前进程继续,只需exec "ls";
。这种方法的优点是将 STDOUT 输出发送到控制台(就像您从命令行输入了命令一样)。\【参考方案7】:
大多数答案都是正确的..
mycmd &
camh 的回答进一步通过 nohup 使其保持活力。
进一步探讨高级主题...
mycmd1 &
mycmd2 &
mycmd3 &
wait
“等待”将阻止处理,直到后台任务全部完成。如果响应时间很长,例如系统外数据收集,这可能很有用。如果您确定它们将完成会有所帮助。
我如何随后将进程置于前台? 如果您打算在后续登录时将进程置于前台,请查看 screen 或 tmux。
screen -dmS MVS ./mvs
或(Minecraft 示例)。
screen -dm java -Xmx4096M -Xms1024M -jar server.jar nogui
您可以在后续登录时重新连接到终端。
screen -r
启动这些的登录不需要是交互式的,您可以远程使用 ssh(plink、Ansible 等)以“驾车”的方式生成这些。
【讨论】:
以上是关于通过 bash 在 linux 中生成一个完全独立的进程的主要内容,如果未能解决你的问题,请参考以下文章