Как запустить первый процесс из списка процессов, хранящихся в файле, и удалить первую строку, как если бы файл был очередью, и я вызвал “pop”?
Вопрос
Как запустить первый процесс из списка процессов, хранящихся в файле, и немедленно удалить первую строку, как если бы файл был очередью, и я вызвал "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 было бы большой работой (перепишите остальную часть файла (что на самом деле не так уж много работы для программиста (это то, что написано для вас в каждом другом сообщении с ответом :) ) ) ).
Я бы рекомендовал сохранить все это в памяти и использовать классический стек, а не файл.