linux命令行的顺序FIFO队列

时间:2012-10-22 03:52:03

标签: linux queue sequential

我正在尝试查找或实现一个简单的解决方案,该解决方案可以按顺序排队Linux shell命令,以便一次执行一个。以下是标准:

  1. 队列必须一次执行一个命令,即不能同时运行两个命令。
  2. 我没有提前命令列表。他们将从我的Web服务器收到的Web请求进入。这意味着队列可能很长时间都是空的,并且可以同时进入10个请求。
  3. 我的Web服务器只能对shell进行系统调用,因此需要从命令行调用此程序/解决方案。
  4. 我只有一台机器,所以它不能也不需要将工作分配给多台机器。
  5. 最初我认为at命令可以做我想要的,但唯一的一点是它不会按顺序执行命令。

    我正在考虑使用以下部分在python中实现我自己的解决方案:

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

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

      那里有没有已经做过的事情,所以我不必自己实现这个?

2 个答案:

答案 0 :(得分:5)

使用命名管道,即FIFO:

mkfifo /tmp/shellpipe

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

/bin/sh < /tmp/shellpipe

当Web服务器想要执行命令时,它会将其写入管道。

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

答案 1 :(得分:1)

posix message queue似乎为此而量身定制,并且比使用带时间戳的文件等更简单(也更快)。脚本可以在请求进入时将其排队;另一个脚本使请求出列并执行它们。有一些大小限制适用于队列,但听起来并不像你会接近它们。