Как запустить первый процесс из списка процессов, хранящихся в файле, и удалить первую строку, как если бы файл был очередью, а я назвал «pop»? - PullRequest
3 голосов
/ 14 декабря 2008

Как запустить первый процесс из списка процессов, хранящихся в файле, и сразу удалить первую строку, как если бы файл был очередью, а я назвал «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
.
.

Ответы [ 7 ]

4 голосов
/ 14 декабря 2008

Ох, это забавная строчка.

Хорошо, вот сделка. Вам нужна программа, которая при вызове печатает первую строку файла в стандартный вывод, а затем удаляет эту строку из файла. Звучит как работа для sed (1) .

Попробуйте

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

Я уверен, что кто-то, кто уже выпил кофе, мог изменить программу sed, чтобы ей не требовался вызов head (1) , но это работает и демонстрирует использование подоболочки ("(foo ) "выполняется в подпроцессе.)

4 голосов
/ 14 декабря 2008

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 голосов
/ 14 декабря 2008

Я предполагаю, что вы также постоянно добавляете файл, поэтому перезапись файла ставит вас под угрозу перезаписи данных. Я думаю, что для задач такого типа вам лучше использовать отдельные файлы для каждой записи очереди, использовать дату / время для определения порядка, а затем, обрабатывая каждый файл, вы можете добавить данные в файл журнала и затем удалить файл триггера.

Действительно нужно больше информации, чтобы предложить хорошее решение. Важно знать, как файл обновляется. Много ли отдельных процессов, только один процесс и т. Д.

1 голос
/ 14 декабря 2008

Вы можете использовать небольшой скрипт bash; назовите его "popcmd":

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

edit: Использование sed для средних двух строк, как показал Чарли Мартин, намного элегантнее, конечно:

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

edit: Вы можете использовать это точно так же, как в вашем примере кода использования:

proc_A | proc_B | popcmd cmdstack.lst | proc_D
1 голос
/ 14 декабря 2008

Если вы хотите обрабатывать файл как стек, то лучшим подходом будет иметь верхнюю часть стека в конце файла.

Таким образом, вы можете легко обрезать файл в начале последней строки (= pop) и просто добавлять к файлу при нажатии.

1 голос
/ 14 декабря 2008

Я думаю, вам нужно переписать файл - например, выполните команду, чтобы вывести список всех строк, кроме первой, запишите ее во временный файл и переименуйте в исходный. Это можно сделать с помощью tail, awk или perl в зависимости от доступных команд.

0 голосов
/ 14 декабря 2008

Вы не можете записать в начало файла, поэтому вырезание строки 1 было бы большой работой (переписать остальную часть файла (что на самом деле не так уж много работы для программиста (это то, что каждый другой) ответ пост написал для вас :)))).

Я бы рекомендовал хранить все это в памяти и использовать классический стек, а не файл.

...