파일에 저장된 프로세스 목록에서 첫 번째 프로세스를 실행하고 파일이 큐인 것처럼 첫 번째 줄을 삭제하는 방법은 "팝"이라고 불렀습니까?

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

문제

파일에 저장된 프로세스 목록에서 첫 번째 프로세스를 실행하고 파일이 큐인 것처럼 첫 번째 줄을 즉시 삭제하는 방법은 "팝"이라고 불렀습니까?

분리기와 같은 간단한 텍스트 파일에 나열된 첫 번째 명령을 팝과 같은 방식으로 호출하고 싶습니다.


그림 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 라이너입니다.

좋아요, 여기 거래가 있습니다. 원하는 것은 호출 될 때 파일의 첫 번째 줄을 stdout에 인쇄 한 다음 해당 라인을 파일에서 삭제하는 프로그램입니다. 직업처럼 들립니다 SED (1).

노력하다

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

이미 커피를 마신 사람이 SED 프로그램을 필요로하지 않도록 변경할 수 있다고 확신합니다. 머리 (1) 전화를 걸지만 작동하며 하위 쉘 ( "(FOO)"가 하위 프로세스로 실행됩니다.)

파일에 지속적으로 추가 중이라고 가정하므로 파일을 다시 작성하면 데이터를 덮어 쓰는 위험에 처하게됩니다. 이 유형의 작업의 경우 각 큐 항목에 개별 파일을 사용하고 날짜/시간을 사용하여 순서를 결정한 다음 각 파일을 처리 할 때 데이터를 로그 파일에 추가 한 다음 트리거 파일을 삭제할 수 있다고 생각합니다.

좋은 솔루션을 제안하려면 더 많은 정보가 필요합니다. 파일이 어떻게 업데이트되는지 아는 것이 중요합니다. 별도의 프로세스, 단 하나의 프로세스 등이 많습니까?

파일을 다시 작성해야한다고 생각합니다. 예를 들어 모든 줄을 나열하기 위해 명령을 실행하고 첫 번째는 임시 파일로 작성하여 원본으로 바꾸십시오. 사용 가능한 명령에 따라 Tail 또는 Awk 또는 Perl을 사용하여 수행 할 수 있습니다.

파일을 스택처럼 처리하려면 더 나은 접근 방식은 파일 끝에 스택의 상단을 갖는 것입니다.

따라서 마지막 줄의 시작 부분에서 파일을 쉽게 잘라 내고 푸시 할 때 파일에 추가 할 수 있습니다.

작은 bash 스크립트를 사용할 수 있습니다. 이름을 "POPCMD"로 지정하십시오.

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

편집하다: Charlie Martin과 같이 중간 두 줄에 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