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

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

Вопрос

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

Решение

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).

Попробуй

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

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

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

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

Я думаю, вам нужно было бы переписать файл - напримерзапустите команду, чтобы перечислить все строки, кроме первой, запишите ее во временный файл и переименуйте его в исходную.Это можно было бы сделать с помощью tail, 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