3

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

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

图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
.
.
4

7 回答 7

4

弹出-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
于 2008-12-14T13:33:45.443 回答
4

哦,这是一个有趣的单线。

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

尝试

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

我敢肯定,已经喝过咖啡的人可以将 sed 程序更改为不需要head(1)调用,但这很有效,并展示了使用子shell(“( foo )”在子进程中运行。 )

于 2008-12-14T14:47:47.603 回答
2

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

确实需要更多信息才能提出一个好的解决方案。了解文件是如何更新的很重要。是不是有很多单独的进程,只有一个进程,等等。

于 2008-12-14T20:26:38.090 回答
1

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

于 2008-12-14T13:21:02.677 回答
1

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

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

于 2008-12-14T13:42:09.763 回答
1

您可以使用一点 bash 脚本;将其命名为“popcmd”:

#!/bin/bash
cmd=`head -n 1 $1`
尾 -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
于 2008-12-14T15:19:11.457 回答
0

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

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

于 2008-12-14T14:54:22.347 回答