并行执行永不完成的命令

并行执行永不完成的命令

我正在尝试运行一些永不结束的命令。这些命令监视目录并在文件更改时更新文件。我的想法是,我需要由不同工具监视的多个文件夹,能够通过单个命令运行所有文件夹。

对于按预期返回的正常命令,使用 分隔命令即可;

ls /;
cd /;
ls var;
cd var;
ls log;
cd log

当我尝试将不返回的命令(如tail -f <some_file>或)链接在一起时coffee -c -w <some_coffeescript_folder>,只有第一个命令会运行。

有没有办法用一个命令完成这个操作?下面是我尝试链接在一起的命令:

coffee -c -m -w public/javascript/*.coffee; \
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/; \
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/;

答案1

您可以通过在命令中添加“&”符号在后台运行它们:

coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &

如果您想查看当前在后台运行的所有作业,请执行以下操作:

jobs -l

要将后台作业重新放到前台,请使用 fg (PID 是可选的):

fg <PID>

要将前台作业(“阻止”你的 shell)发送回后台模式,请使用 Ctrl-Z / bg:

$ tail -f foobar.log # is "blocking" your shell
(hit Ctrl-Z)
$ bg

我猜这些作业已绑定到您的 shell,不会自动分叉。这意味着如果您通过 SSH 登录并断开连接,shell 会收到 SIGHUP,该信号也会发送到作业。这将停止/退出您的命令。

如果您希望在退出后仍能保持作业正常运行,您可能需要查看 bash 内置的“disown”:

jobs               # fetch job ID in the squre brackets
disown -h %<JOBID> # disown job by using the job ID

另一个选项是“nohup”(命令,不是 bash 内置)或者使用终端多路复用器,如“screen”或“tmux”。

答案2

尝试这个:

coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &

相关内容