2008-12-14 6 views
3

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

Я хотел бы назвать первую команду, перечисленные в простом текстовом файле с \ п как разделитель в поп-как мода:


Рисунок 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 
. 
. 
+0

Я предполагаю, что это технически ** очередь **, поскольку я сомневаюсь, что новые команды также добавляются в верхнюю часть файла. Реализация стека в файле будет иметь больший смысл с конца файла. – jmucchiello 2008-12-14 18:05:42

+0

Вы правы. Спасибо за примечание. – secr 2008-12-14 19:15:12

ответ

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 
+0

Python немного завышен. – Svante 2008-12-14 17:00:31

+0

@ Харлекин: сценарий кросс-платформенный. Он не имеет зависимостей, кроме самого питона. Какую альтернативу вы могли бы предложить? – jfs 2008-12-14 18:38:38

1

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

1

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

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

4

О, это забавный однострочный.

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

Попробуйте

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

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

0

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

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

1

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

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

редактировать: Использование СЭД для двух средних линий, как Чарли Мартин показал, гораздо более изящным, конечно:

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

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

proc_A | proc_B | popcmd cmdstack.lst | proc_D
2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^