저는 대부분의 빌드, 설치, 배포 및 설치 후 프로세스를 자동화하는 복잡한 자동화 스크립트를 개발 중입니다. 문제는 실행해야 하는 모든 명령 중에 사용자가 루트여야 하는 명령이 있다는 것입니다. (필요한 다른 사용자(user1이라고 함)가 sudoers 목록에 없기 때문에 이는 요구 사항 제약 조건입니다.)
기본적으로 제가 스크립트를 구성한 방식은 루트로 실행해야 하는 시작 스크립트가 있다는 것입니다. 이 스크립트는 다른 두 스크립트를 user1로 호출합니다.
세 스크립트 모두 sharedFunctions.sh
공통 기능을 정의하는 스크립트를 공유합니다. 이 스크립트에는 run_command
이 문제에 중요하지 않은 명령과 실패 문자열 및 기타 매개 변수를 허용해야 하는 함수가 있습니다.
이제 주어진 명령의 출력에 실패 문자열이 나타나면 상위 프로세스를 종료하여 전체 열차를 중지하고 싶습니다. 루트 스크립트에서 가져온 상위 PID에 대해 내보낸 변수가 있지만 두 user1 스크립트 중 하나를 실행할 때 스크립트가 실패하면 루트가 소유한 프로세스를 종료할 수 없습니다.
자격 증명을 요구하지 않고 루트로 다시 "종료"하여(터미널에서 수행하는 것과 유사) 루트 소유 PID를 삭제할 수 있는 방법이 있습니까?
*****편집하다*****
다음은 내 스크립트가 따라야 하는 매우 단순화된 프로세스입니다. 형식은 다음과 같습니다(필수 사용자: 함수).
user1:maven install
user1:scp jars to chef server
root:chef command
user1:chef command
user1:post-installation scripts
세 개의 스크립트와 하나의 소스 스크립트가 있습니다.
user1cmd1.sh
parentscript.sh
user1cmd2.sh
sharedFunctions.sh
첫 번째 parentscript.sh
스크립트는 이를 사용하여 PID를 추출한 export TOP_PID=$$
다음 user1cmd1.sh를 user1로 호출합니다. 해당 스크립트가 완료되면 상위 스크립트로 돌아가서 Chef 명령을 루트로 실행한 다음 user1cmd2.sh를 user1로 호출합니다.
내 파일 run_command
에 정의된 스크립트는 sharedFunctions.sh
다음과 같습니다.
run_command(){
cmd=$1
fail=$2
if $cmd | grep -q $fail;then
kill $TOP_PID #there is more to this particular command, but I don't have it in front of me
fi
}
답변1
parentscript.sh
reaper 프로세스를 생성하여 에 전달할 수 있습니다 $TOP_PID
. 리퍼 프로세스는 다음에서 시작하려고 시도합니다.명명된 파이프이것은 쓰기 가능합니다 user1
. 파이프에 아무것도 기록되지 않으면 수확기는 읽기를 차단하고 다른 작업은 수행하지 않습니다. 그러나 파이프에 기록된 내용이 있으면 수확기의 읽기가 완료되고 수확기는 나머지 코드를 계속 실행하여 종료됩니다. -레벨 프로세스.