linux命令行的顺序FIFO队列

Add*_*son 0 linux queue sequential

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

  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脚本将检查自身的另一个实例是否正在运行.如果是,则退出,这将使另一个实例处理新排队的"命令文件".如果不是,则锁定锁定文件并按顺序开始执行"命令文件"

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

有什么东西已经做到了,所以我不必自己实现吗?

Bar*_*mar 5

使用命名管道,即FIFO:

mkfifo /tmp/shellpipe
Run Code Online (Sandbox Code Playgroud)

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

/bin/sh < /tmp/shellpipe
Run Code Online (Sandbox Code Playgroud)

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

sprintf(cmdbuf, "echo '%s' > /tmp/shellpipe", command);
system(cmdbuf);
Run Code Online (Sandbox Code Playgroud)