파일에 저장된 프로세스 목록에서 첫 번째 프로세스를 실행하고 파일이 큐인 것처럼 첫 번째 줄을 삭제하는 방법은 "팝"이라고 불렀습니까?
문제
파일에 저장된 프로세스 목록에서 첫 번째 프로세스를 실행하고 파일이 큐인 것처럼 첫 번째 줄을 즉시 삭제하는 방법은 "팝"이라고 불렀습니까?
분리기와 같은 간단한 텍스트 파일에 나열된 첫 번째 명령을 팝과 같은 방식으로 호출하고 싶습니다.
그림 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 행을 잘라내는 것은 많은 작업이 될 것입니다 (나머지 파일을 다시 작성하십시오 (실제로 프로그래머에게는 그다지 많은 작업이 아닙니다). 당신을 위해 작성 :)))).
모든 것을 메모리에 유지하고 파일보다는 클래식 스택을 사용하는 것이 좋습니다.