2012-10-22 29 views
0

我试图找到或实现一个简单的解决方案,它可以按顺序排列Linux shell命令,以便一次执行一个。这里是标准:用于linux命令行的顺序FIFO队列

  1. 队列必须一次执行一个命令,即没有两个命令可以同时运行。
  2. 我没有提前列出命令。他们将从Web服务器收到的Web请求中进入。这意味着队列可能很长一段时间是空的,同时可以有10个请求进入。
  3. 我的web服务器只能对shell进行系统调用,所以这个程序/解决方案需要从命令行调用。
  4. 我只有一台机器,所以它不能也不需要将工作排除到多台机器上。

最初我以为at命令可以做我想做的,但唯一的是它不会按顺序执行命令。

我想实现在Python与这些零件自己的解决方案中:

  1. 有一个锁定文件的专用目录
  2. 排队命令被存储为文件名的单个文件包含一个递增序列ID或时间戳或类似的东西,我将其称为“命令文件”
  3. 在锁定文件上使用fcntl模块编写python脚本,以确保只有1个脚本实例正在运行
  4. 脚本将监视任何文件的目录并按照文件名的顺序在文件中执行shell命令
  5. 当目录中没有更多的“命令文件”时,脚本将解锁锁定文件并退出
  6. 当我的web服务器想要为了排队工作,它会添加一个新的“命令文件”并调用我的python脚本
  7. python脚本将检查自身的另一个实例是否正在运行。如果是,则退出,这将让另一个实例处理新排队的“命令文件”。如果不是,那么锁定锁文件并按顺序开始执行“命令文件”

这听起来像是会起作用吗?我不知道如何处理的唯一竞争条件是当脚本的第一个实例检查目录并且看到它是空的,并且在它解锁锁定文件之前,一个新的命令排队并且脚本的新实例被调用。当新脚本看到文件被锁定时将退出。然后原始脚本将解锁文件并退出。

那里有东西已经做了这个,所以我不必自己实现这个吗?

+0

你真的要让网络用户在你的系统上运行shell命令吗?第一次有人运行'rm -rf *'时会发生什么? –

+0

没有。我基于用户在表单提交中提供的信息运行我自己的shell命令,从中我将自己的params生成到我的shell脚本中。 – Addison

回答

5

使用命名管道,又名FIFO:

mkfifo /tmp/shellpipe 

启动shell进程,其输入来自管道:

/bin/sh < /tmp/shellpipe 

当Web服务器要执行的命令,那么将其写入到管道。

sprintf(cmdbuf, "echo '%s' > /tmp/shellpipe", command); 
system(cmdbuf); 
1

一个posix message queue似乎比时间戳文件,这样乱搞,这和一大堆简单,速度更快量身定做。脚本可以在请求进入时排队;另一个脚本将这些请求出列并执行它们。有一些适用于队列的大小限制,但听起来你不会接近它们。