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

StackOverflow https://stackoverflow.com/questions/366533

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

我想调用的简单文本文件与\ n,作为弹出式类似的方式分离器中列出的第一个命令:


图1:

cmdqueue.lst :

proc_C1
proc_C2
proc_C3
.
.

图2:

通过POP的第一个命令的 popcmd

proc_A | proc_B | popcmd cmdqueue.lst | proc_D

图3:

cmdqueue.lst :

proc_C2
proc_C3
proc_C4
.
.
有帮助吗?

解决方案

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

其他提示

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

好了,这里的交易。你需要的是一个程序,调用它时,打印文件到标准输出的第一行,然后从文件中删除该行。听起来像作业 sed的(1)

尝试

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

我敢肯定,有人谁已经有他们的咖啡能改变sed的程序不需要的头(1)的电话,但该作品,并展示了使用子shell(“(富)”在子进程中运行。)

我假设你不断追加到文件还,因此重写文件使您可以覆盖数据的危险。对于这种类型的任务,我认为你会使用单独的文件为每个队列的条目,使用日期/时间来确定为了得到更好的,然后当你处理每一个文件,你可以将数据追加到一个日志文件,然后删除触发文件。

真的需要更多的信息,以提供一个好的解决方案。它知道文件是如何得到更新是非常重要的。它是一个独立的大量处理的,只是一个过程,等等。

我想你需要重写文件 - 例如运行命令列出所有线,但第一,编写到一个临时文件,并将其重命名为原来的。这可以通过使用尾或AWK或Perl取决于你有可用的命令来完成。

如果您要像对待一个叠一个文件,然后一个更好的方法是有堆栈的顶部在文件的结尾。

因此可以很容易地切断在最后一行(= POP)的开头的文件,并简单地追加到该文件的推入。

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

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

编辑:使用的sed用于中间两行,像查理马丁表明,是更优雅,当然:

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

编辑:的你可以使用这个完全按照您的使用例子代码:

proc_A | proc_B | popcmd cmdstack.lst | proc_D

您不能写入文件的开头,所以切割出1号线将是一个很大的工作(改写文件的其余部分(这实际上不是程序员那么多的工作(这就是每隔答案后为你:))))。写

我会建议保持在内存中的整个事情,使用经典的堆栈,而不是一个文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top