2016-07-17 2 views
1

다른 컴퓨터에 로그인하여 서비스가 실행 중인지 확인하고 해당 서비스를 시작, 중지 또는 종료하는 데몬을 작성 중입니다. 이 때문에 유닉스 명령어는 조금 길어지고 난독 화된다. 복잡한 유닉스 명령 내에서 pgrep/pkill 명령에 부정적인 lookahead 만들기

형성되는 명령의 기본 형상은

등을들 수있다 : APP 원격 실행 파일의 이름이고 APP_ID 시작할 때 응용 프로그램에 전달하는 파라미터

bash -c 'ssh -p 22 [email protected] pgrep -fl "APP.*APP_id=12345"' 

. 이 명령의 종료 상태는 원격 서비스가 실행되고 있는지 확인하는 데 사용됩니다 또는 성공적으로 시작되었다 또는 사망

/path/to/APP configs/config.xml -v APP_id=12345 APP_port=2345 APP_priority=7 

:

원격 측의 실행 파일을 실행

같은 뭔가 시작됩니다.

내가 겪고있는 문제는 내 로컬 컴퓨터에서 테스트 할 때 ssh가 일을 더 쉽게하기 위해 로컬 컴퓨터에 연결하지만이 방법으로 호출되는 pgrep은 서버가 실행중인 ssh 명령을 확인한다는 것입니다 .

예를 들어, pgrep을 반환 할 수 있습니다

26308 ./APP configs/config.xml APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5 APP_nodeType=all APP_exportPort=6500 APP_clientPriority=11 
27915 ssh -p 22 [email protected] pgrep -fl APP.*APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5 

것은 그래서 논리적 인 다음 단계는 'SSH'를 제외 할 pgrep을 패턴을 변경했지만, pgrep을가 PCRE로 컴파일하지 않는 것 때문에 불가능 보인다

bash -c 'ssh -p 22 [email protected] pgrep -fl "APP.*APP_id=12345" \\| grep -v ssh' 
: 해결 방법으로 내가 GREP을 사용 그래서,

bash -c -'ssh -p 22 [email protected] preg -fl "\(?!ssh\).*APP.*APP_id=12345" 

이것은 정규식 오류가 발생합니다 : 예를 들어, lookaheads 수 있습니다 버전

이것은 문제 해결 방법이지만 pgrep을 사용하여 쿼리 할 때 유용합니다. pkill에 또한 종료 상태가 나쁜 원인 ssh 연결을 죽이기 때문에

bash -c 'ssh -p 22 [email protected] pkill -f "APP.*APP_id=12345"' 

이 잘 작동하지 않습니다 : GREP 적용하려면 더 기회가 없기 때문에 그러나, 다음 단계를 사용하여 pkill에 작동하지 않습니다. 그래서, 나는 다시 pgrep/pkill 패턴을 수정하고 많은 행운이 없다.

이 환경이 암호없이 자체에 ssh를 할 수있는 로컬 컴퓨터에 뭔가 간단한 시뮬레이션 할 수 있습니다

(이 경우, APP은 '시계'가 될 것이다) : 여기

watch echo APP_id=12345 

는 단순히 넣어 질문 : pgrep에서 'APP'와 어떻게 일치합니까? 'ssh user @ host APP'와는 어떻게 일치합니까?

+0

필요한 패턴을 더 잘 이해하기 위해 프로세스 목록을 포함하면 도움이 될 수 있습니다. –

+0

[systemd user instance] (https://wiki.archlinux.org/index.)를 사용할 수 있습니다.php/Systemd/User)를 사용하여 * systemd * 서비스를 관리 할 수 ​​있습니다. –

+0

@ JürgenHötzel 원격 컴퓨터가 클라우드 인스턴스 ... systemd 용으로 작성하고있는 서비스를 설치할 수는 있지만, 그다지 문제는 아닙니다 ... 일부 정규식 구문이 누락되면 궁금합니다. 모르겠다. –

답변

1

그것은 대안의 종류,하지만 작업을 수행합니다에만 응용 프로그램 이름 앞에 공백이없는 명령을 일치

bash -c 'ssh -p 22 [email protected] pgrep -fl "^[^\s]*APP.*APP_id=12345"' 

.... 이것은 실행 파일에 대한 경로에 공백이있는 디렉토리가있을 수 있기 때문에 완전히 완료되지는 않지만 lookaround 구문이 없기 때문에이 작업을 수행하는 또 다른 방법을 생각하지 못했습니다.

관련 문제