功能的并行运行

Zhy*_*ndr 4 bash shell-script function parallelism

我有 3 个功能,比如

function WatchDog {
sleep 1

#something
}
function TempControl {
sleep 480

#somthing
}
function GPUcontrol {
sleep 480

#somethimg
}
Run Code Online (Sandbox Code Playgroud)

我正在运行它

WatchDog | TempControl | GPUcontrol
Run Code Online (Sandbox Code Playgroud)

此脚本位于rc.local文件中。因此,从逻辑上讲,它应该自动运行。问题是第一个功能运行良好。但是第二和第三没有开始。但如果我开始像

sudo bash /etc/rc.local 
Run Code Online (Sandbox Code Playgroud)

这工作正常。问题是什么?如果我将它添加到 init.d 目录,同样的事情。

Rom*_*est 6

只需使用 GNU并行

export -f WatchDog && export -f TempControl && export -f GPUcontrol

parallel -j3 ::: WatchDog TempControl GPUcontrol
Run Code Online (Sandbox Code Playgroud)
  • export -f <funcname> - 导出要引用的函数 parallel

  • -j N- 最多并行运行N个作业


演示测试用例:

function a () { seq -s' ' 1 10; sleep 10; }
function b () { echo {a..z}; sleep 5; }
function c () { echo {-100..-80}; sleep 10; }
export -f a && export -f b && export -f c
parallel --no-notice  -j3 ::: c b a

a b c d e f g h i j k l m n o p q r s t u v w x y z
-100 -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -88 -87 -86 -85 -84 -83 -82 -81 -80
1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)


jes*_*e_b 2

管道将一个命令的输出发送到下一个命令。您正在寻找&(& 符号)。这会分叉进程并在后台运行它们。所以如果你跑:

WatchDog & TempControl & GPUcontrol
Run Code Online (Sandbox Code Playgroud)

它应该同时运行所有三个。

另外,当您运行时,sudo bash /etc/rc.local我相信是串行运行它们而不是并行运行它们(它等待每个命令完成后再开始下一个命令)。那会是这样的:

WatchDog ; TempControl ; GPUcontrol
Run Code Online (Sandbox Code Playgroud)

命令分隔符

; 分号 -command1 ; command2

无论是否成功,都会在完成command2后执行command1

& 和符号 -command1 & command2

这将command1在子 shell 中执行并command2同时执行。

|| 或逻辑运算符 -command1 || command2

这将执行command1,然后command2 command1失败时执行

&& AND 逻辑运算符 -command1 && command2

这将执行command1,然后command2 command1成功时执行。