通过 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】:

&?

#!/usr/bin/bash # command1.sh:执行command2.sh并退出 命令2.sh &

【讨论】:

你是如何得到一只四角独角兽,头上有四个角的? 它是一只角,但它站在彩虹的前面。【参考方案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 中生成一个完全独立的进程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 bash 中生成步骤 n 的范围? (生成带增量的数字序列)

如何在 Python 中生成一个新的独立进程

在bash中生成特定日期

sh 在bash中生成UUID4的便携方法

sh 用于在git repo中生成作者列表的Bash脚本

在 git bash 中生成 SSH 密钥,我无法获取 git 代理