如何从存储在文件中的进程列表中运行第一个进程,并立即删除第一行,就像文件是队列一样,我称之为“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
.
.
答案 0 :(得分: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
答案 1 :(得分: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)“在一个子流程中运行。”
答案 2 :(得分:2)
我认为你也经常附加到文件中,因此重写文件会使你有覆盖数据的危险。对于这种类型的任务,我认为您最好为每个队列条目使用单个文件,使用日期/时间来确定顺序,然后在处理每个文件时,您可以将数据附加到日志文件,然后删除触发器文件。
真的需要更多信息才能提出一个好的解决方案。了解文件的更新方式非常重要。它是很多单独的流程,只是一个流程等。
答案 3 :(得分:1)
我认为你需要重写文件 - 例如运行命令列出除第一行之外的所有行,将其写入临时文件并将其重命名为原始行。这可以使用tail或awk或perl来完成,具体取决于您可用的命令。
答案 4 :(得分:1)
如果要将文件视为堆栈,那么更好的方法是将堆栈的顶部放在文件的末尾。
因此,您可以轻松地在最后一行(= pop)的开头剪切文件,并在推送时简单地附加到文件。
答案 5 :(得分: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
答案 6 :(得分:0)
你不能写入文件的开头,所以删除第1行将是很多工作(重写文件的其余部分(这对程序员来说实际上并没有那么多工作)(这是其他所有工作)答案帖子已经为你写了:))))。
我建议将整个内容保留在内存中并使用经典堆栈而不是文件。