在后台静默启动任务

Tyi*_*ilo 15 process zsh trap

我知道你可以使用它在后台启动一个进程,而不会在进程被置于后台以及完成时收到通知:

(命令 &) &> /dev/null

但是,这会删除进程完成时捕获的选项 ( trap child_done CHLD)。

我怎么能两者兼得?

Raú*_*udo 7

任务后台处理程序可能会帮助你。

正如在freshmeat.net 中

任务假脱机程序是一种 Unix 批处理系统,其中假脱机的任务一个接一个地运行。可以随时设置一次运行的作业数量。每个系统中的每个用户都有自己的作业队列。任务在任何 shell/进程的正确上下文(入队)中运行,并且可以轻松查看其输出/结果。当您知道您的命令依赖于大量 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
Run Code Online (Sandbox Code Playgroud)

如果您在后台运行大量作业,它肯定会对您有所帮助。

您可以按顺序或在预设数量的插槽中运行它们。您也可以建立任务之间的依赖关系(运行TASK1只有task0成功完成)。


Tom*_*ale 5

以下是如何在两者中做到这一点{ba,z}sh

使用函数有助于不需要通过使用来保存和恢复zshmonitor变量的状态setopt local_options

# Run the command given by "$@" in the background
silent_background() {
  if [[ -n $ZSH_VERSION ]]; then  # zsh:  https://superuser.com/a/1285272/365890
    setopt local_options no_notify no_monitor
    "$@" &
  elif [[ -n $BASH_VERSION ]]; then  # bash: https://stackoverflow.com/a/27340076/5353461
    { 2>&3 "$@"& } 3>&2 2>/dev/null
  else  # Unknownness - just background it
    "$@" &
  fi
}
Run Code Online (Sandbox Code Playgroud)

使用方法如下:

trap 'echo child done' CHLD
silent_background sleep 1
Run Code Online (Sandbox Code Playgroud)

将产生预期的child done消息。