如何从存储在文件中的进程列表中运行第一个进程并删除第一行,就像文件是队列一样,我称之为“pop”?

时间:2008-12-14 13:09:11

标签: windows unix shell queue pop

如何从存储在文件中的进程列表中运行第一个进程,并立即删除第一行,就像文件是队列一样,我称之为“pop”?

我想调用一个简单文本文件中列出的第一个命令,其中\ n作为分隔符以类似pop的方式:


图1:

cmdqueue.lst :

proc_C1
proc_C2
proc_C3
.
.

图2:

通过 popcmd

弹出第一个命令
proc_A | proc_B | popcmd cmdqueue.lst | proc_D

图3:

cmdqueue.lst :

proc_C2
proc_C3
proc_C4
.
.

7 个答案:

答案 0 :(得分:4)

是的,这是一个有趣的单行。

好的,这是交易。你想要的是一个程序,当被调用时,将文件的第一行打印到stdout,然后从文件中删除该行。听起来像是 sed(1)的作业。

尝试

proc_A | proc_B | `(head -1 cmdstack.lst; sed -i -e '1d' cmdstack.lst)` | proc_D

我确信已经喝咖啡的人可以将sed程序更改为不需要 head(1)调用,但这样可行,并使用子shell显示(“( foo)“在一个子流程中运行。”

答案 1 :(得分:4)

pop-cmd.py:

#!/usr/bin/env python
import os, shlex, sys
from subprocess import call
filename = sys.argv[1]
lines = open(filename).readlines()
if lines:
    command = lines[0].rstrip()
    open(filename, "w").writelines(lines[1:])
    if command:
        sys.exit(call(shlex.split(command) + sys.argv[2:]))

示例:

proc_A | proc_B | python pop-cmd.py cmdstack.lst | proc_D

答案 2 :(得分:2)

我认为你也经常附加到文件中,因此重写文件会使你有覆盖数据的危险。对于这种类型的任务,我认为您最好为每个队列条目使用单个文件,使用日期/时间来确定顺序,然后在处理每个文件时,您可以将数据附加到日志文件,然后删除触发器文件。

真的需要更多信息才能提出一个好的解决方案。了解文件的更新方式非常重要。它是很多单独的流程,只是一个流程等。

答案 3 :(得分:1)

你可以使用一个小的bash脚本;将其命名为“popcmd”:

#!/bin/bash
cmd=`head -n 1 $1`
tail -n +2 $1 > ~tmp~
mv -f ~tmp~ $1
$cmd

编辑:使用sed作为中间两行,如Charlie Martin所示,当然要优雅得多:

#!/bin/bash
cmd=`head -n 1 $1`
sed -i -e '1d' $1
$cmd

编辑:您可以使用与示例使用代码完全相同的内容:

proc_A | proc_B | popcmd cmdstack.lst | proc_D

答案 4 :(得分:1)

我认为你需要重写文件 - 例如运行命令列出除第一行之外的所有行,将其写入临时文件并将其重命名为原始行。这可以使用tail或awk或perl来完成,具体取决于您可用的命令。

答案 5 :(得分:1)

如果要将文件视为堆栈,那么更好的方法是将堆栈的顶部放在文件的末尾。

因此,您可以轻松地在最后一行(= pop)的开头剪切文件,并在推送时简单地附加到文件。

答案 6 :(得分:0)

你不能写入文件的开头,所以删除第1行将是很多工作(重写文件的其余部分(这对程序员来说实际上并没有那么多工作)(这是其他所有工作)答案帖子已经为你写了:))))。

我建议将整个内容保留在内存中并使用经典堆栈而不是文件。