
exec 명령에 종속성 중 하나의 PID를 전달해야 하는 시스템 단위 파일을 작성하고 싶습니다. 단위 파일에서 다음을 갖고 싶습니다.
ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service
필요한 종속성의 PID를 쉬운 방법으로 얻을 수 있는 방법이 있습니까? Ubuntu 데스크탑의 장치 파일에서 매뉴얼이나 예제에서 아무것도 찾을 수 없습니다.
사용 사례는 원격 성능 디버깅을 수행하기 위해 JProfiler 데몬을 Java 기반 서비스에 연결하는 데 사용할 수 있는 간단한 단위 파일을 생성하는 것입니다. 프로파일러를 연결하는 명령에는 JVM의 PID가 필요합니다.
답변1
-p
,--property=
유닛/직업/관리자 속성을 표시할 때보여주다명령을 실행하면 인수에 지정된 속성만 표시되도록 제한됩니다. 인수는 쉼표로 구분된 속성 이름 목록이어야 합니다.와 같은 "
MainPID
". [...]
따라서 (PID가 아닌) systemctl show -p MainPID foo
표시됩니다 . 최근에 MainPID=<pid>
추가 --value
(또는 조합 매개변수 (대문자) 사용)-P
체계화된)는 다음 값만 제공합니다.
--value
show를 사용하여 속성을 인쇄하는 경우 값만 인쇄하고 속성 이름과 "="는 건너뜁니다. 위의 -P 옵션도 참조하세요.
버전 230에서 추가되었습니다.
그래서 서비스라면푸Main PID로 식별할 수 있습니다(예: 대상 프로세스가 실제로 기본 PID의 하위 프로세스가 아님). 이는 다음과 같이 사용될 수 있습니다.
/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'
자체 스크립트가 아닌 경우 다음을 수행할 수 있습니다.:
구문 분석을 피하기 위해 실행 가능한 줄 앞에 접두사를 사용하십시오 .체계화된:
접두사 효과 ... ... ":" 실행 파일 경로 앞에 ":"가 붙는 경우 환경 변수 대체(아래 "명령줄" 섹션에 설명됨)가 적용되지 않습니다. ... ...
따라서 서비스 파일에서 동일하게 유지합니다.
ExecStart=:/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'