Linux:如何在后台排队一些工作?

时间:2011-01-04 15:17:20

标签: linux queue

这是我正在寻找的功能(并且还没有找到):

我想要按顺序运行x进程。其中一些可能非常耗时。

我希望这些进程在shell的后台运行。

我知道nohup,但它似乎并不完美...假设job1是一项耗时的工作,如果我在执行nohup job1&&& job2&& job3&,然后job2和job3将不会运行,job1可能运行也可能不运行,具体取决于我让nohup运行多长时间。

有没有办法获得我想要的功能?我是ssh'ed到Linux服务器。对于奖励积分,即使我关闭连接,如果我排队的工作会继续运行,我也会喜欢它。

感谢您的帮助。

编辑:问题的一个小附录:如果我有一个包含三个exec语句的shell脚本

执行BIGTHING 执行小事 exec smallthing

它肯定会顺序吗?有没有办法将这些全部包装到一个exec行中以获得相同的功能?

即exec BIGTHING&小事和小事或&&或某些

7 个答案:

答案 0 :(得分:11)

使用screen

  1. ssh到服务器
  2. 运行screen
  3. 启动您的程序:job1;job2;job3 - 以分号分隔,它们将按顺序运行
  4. 从屏幕上分离:CTRL-AD
  5. 从服务器退出
  6. (后)

    1. ssh到服务器
    2. 运行screen -r
    3. 你的shell在你的作业队列正在运行......

答案 1 :(得分:7)

或者,如果您想要更多地控制队列,例如列出和修改条目的能力,请查看Task Spooler。它在Ubuntu 12.10 Universe存储库中作为包task-spooler提供。

答案 2 :(得分:2)

我同意screen是非常方便的工具。还有一个额外的命令行工具enqueue - 可以根据需要启用其他作业,即使您已经启动了其中一个作业,也可以在第一个作业已经运行时添加另一个作业。

以下是来自enqueue自述文件的示例:

$ enqueue add mv /disk1/file1 /disk2/file1
$ enqueue add mv /disk1/file2 /disk2/file2
$ enqueue add beep
$ enqueue list

答案 3 :(得分:1)

更多信息:

如果您将作业与&&amp ;;分开它等同于编程语言中的&& /和运算符,例如在if语句中。如果作业1返回错误,则作业2不会运行,等等。这称为"短路。"如果你将工作分开;相反,无论返回代码如何,它们都将运行。

如果你用&结束这一行它会背景整个事情。如果你忘记了,你可以点击control + z暂停命令并给你一个提示,然后命令" bg"将背景他们。

如果你关闭你的ssh会话,它可能会结束命令,因为它们被附加到你的shell(至少在bash的大多数实现中)。如果您希望在注销后继续使用,请使用命令" disown"。

答案 4 :(得分:0)

在你的命令发出&

之后

用于运行名为foo的可执行文件的exmaple:

./foo &

即使关闭ssh连接,它也会继续运行。

答案 5 :(得分:0)

从shell中获取作业的基本机制是

job1 &

所以你可以做一个简单的shell脚本,为其中的几个顺序执行它,尽管在那时我会考虑使用perl或python这样的脚本语言,并编写一个简单的脚本来分叉这些进程。如果你的脚本将自己作为第一步,并且在fork中完成所有工作,它将立即在shell上将控制权返回给你,即使你注销也会继续运行。

答案 6 :(得分:0)

要将它从shell中分离出来(使用&后面的任务需要进行shell游戏),请使用

setsid foo