66개의 Redhat 상자에 있는 모든 죽은 프로세스를 텍스트 파일로 출력하는 스크립트를 작성하려고 합니다. 나는 하나의 상자에서 이 작업을 수행하는 원칙을 이해하지만 프로세스를 하나의 상자에서 실행되지만 여러 상자에 쿼리하도록 하는 방법을 잘 모르겠습니다.
그래서 저는 다음과 같은 작은 스크립트를 찾았습니다.
for host in $(cat hosts.txt); do ssh "$host" "$command" >"output.$host"; done
ps -ef | grep "defunct"
기본적으로 커밋으로 수행할 수 있다는 것을 알고 있지만 $command
, 제가 생성한 모든 출력 파일은 실행 중인 호스트에서 삭제될 것 같습니다.
한 상자에서 이 프로그램을 실행하고 해당 상자에 출력을 저장해야 하지만 다른 65개 상자의 정보도 함께 저장해야 합니까?
나는 우리가 비밀번호가 없는 SSH를 가지고 있다고 믿습니다. 유닉스에 대한 지식은 중간 정도이고, SAS를 사용하기 때문에 조금 알고 있습니다.
답변1
리디렉션은 원격 컴퓨터가 아닌 호출 컴퓨터에서 발생하므로 결과 파일은 로컬이 됩니다. 또한 grep
원격으로 실행할 필요가 없습니다.
while read -r host; do
ssh "$host" ps -ef | grep "defunct" >"output.$host"
done <hosts.txt
이는 ps -ef
각 호스트에서 실행되고 출력 라인을 grep
추출합니다 . 원격이 아닌 로컬로 실행 defunct
됩니다 . grep
이번에도 결과 파일이 로컬로 생성됩니다.
단일 출력 파일을 원하는 경우:
while read -r host; do
ssh "$host" ps -ef | grep "defunct"
done <hosts.txt >output.txt
또는 (단일 통화의 경우 grep
)
while read -r host; do
ssh "$host" ps -ef
done <hosts.txt | grep "defunct" >output.txt