Answers:
任务假脱机程序可能会帮助您。
任务假脱机程序是Unix批处理系统,其中被假脱机的任务一个接一个地运行。可以随时设置一次运行的作业数量。每个系统中的每个用户都有自己的作业队列。这些任务在任何外壳程序/进程中都在正确的上下文(入队上下文)中运行,并且可以轻松查看其输出/结果。当您知道命令取决于大量RAM,大量磁盘使用,提供大量输出或者出于某种原因最好不要同时运行所有命令而又想保留所有命令时,此功能非常有用您的资源忙于最大的收益。它的界面允许在脚本中轻松使用它。
Task-spooler在Debian,Ubuntu和其他发行版中可用。
它使您可以运行一系列任务,并根据需要访问它们的输出。
例如:
$ tsp sleep 5
0
$ tsp sleep 5
1
$ tsp
ID State Output E-Level Times(r/u/s) Command [run=1/1]
2 running /tmp/ts-out.ZWn6Le sleep 5
1 finished /tmp/ts-out.Fhlcle 0 5.00/0.00/0.01 sleep 5
如果您在后台运行大量工作,那一定会对您有所帮助。
您可以按顺序运行它们,也可以按预设的插槽数量运行它们。您也可以建立任务之间的依赖关系(运行TASK1只有task0成功完成)。
这两种方法都是这样做的{ba,z}sh
。
使用功能可以不需要保存和恢复状态zsh
的monitor
使用的变量setopt local_options
。
# Run the command given by "$@" in the background
silent_background() {
if [[ -n $ZSH_VERSION ]]; then # zsh: /superuser//a/1285272/365890
setopt local_options no_notify no_monitor
"$@" &
elif [[ -n $BASH_VERSION ]]; then # bash: /programming//a/27340076/5353461
{ 2>&3 "$@"& } 3>&2 2>/dev/null
else # Unknownness - just background it
"$@" &
fi
}
使用方法如下:
trap 'echo child done' CHLD
silent_background sleep 1
将产生预期的child done
消息。
命令输出的重定向似乎无关紧要,因为在异步启动作业时,通知是由Shell发送的。更确切地说,它是与作业控制相关的外壳功能(功能性)。
在此,引自《 Bash参考手册》第一章“作业控制”。
Shell将JOB与每个管道关联。它保留一个当前正在执行的作业的表,该表可能随
jobs
命令列出。当Bash异步启动作业时,它会打印一条类似于以下内容的行:[1] 25647
指示此作业是作业编号1,并且与此作业关联的管道中最后一个进程的进程ID是25647。单个管道中的所有进程都是同一作业的成员。Bash使用JOB抽象作为作业控制的基础。
请注意,shell脚本不会显示此通知。
$ cat test
#!/bin/bash
true & echo true
$ ./test
true
Zsh文档提供了有关这些通知的类似指示,请参见man 1 zshmisc
“作业”部分。禁用作业控制时,不会显示这些通知。
监视器(-m,ksh:-m)
允许作业控制。在交互式外壳中默认设置。
zsh_prompt % setopt no_monitor
zsh_prompt % true & echo true
true
zsh_prompt %
zsh_prompt %
看来Bash总是显示[1] 25647
。禁用作业控制[1]+ Done true
时,例如不会显示“最终通知” 。
bash_prompt $ true & echo true
[1] 25647
true
bash_prompt $
[1]+ Done true
作业控制已禁用
bash_prompt $ set +m # disable job control
bash_prompt $ true & echo true
[1] 25685
bash_prompt $
bash_prompt $
我不知道禁用作业控制以隐藏通知是否是件好事?
man 1 zshmisc
,“工作”部分。man 1 zshoptions
。