원격 컴퓨터를 업데이트하기 위한 스크립트를 작성 중이며 업데이트하기 전에 사용자가 컴퓨터를 사용하고 있는지 알고 싶습니다. 사용자 목록이 있고 모든 사용자를 위한 heredoc을 만들었습니다. 내가 만들려는 명령은 다음과 같습니다.
ps -ef | grep -f | cat <<- END
user1
user2
user3
END
이것은 작동하지 않습니다. Heredoc을 사용하여 내 사용자 목록을 기반으로 ps 명령을 필터링하려면 어떻게 해야 합니까?
답변1
짧은 답변:ps -u user1,user2,user3
옵션에 인수가 필요하므로 명령 grep
이 불완전합니다 -f
. 귀하의 cat
명령은 here 문서에서 입력을 받으므로 명령을 수정하더라도 grep
해당 출력은 삭제됩니다.
하드코딩된 사용자를 찾고 있다면 다음을 사용할 수 있습니다.
ps -ef | grep alice
(이것은 좋은 접근 방식이 아니라는 점을 제외하면 나중에 설명하겠습니다.) 입력 grep
은 출력입니다 ps -ef
. -e
여러 옵션을 전달하여 여러 검색 패턴을 전달할 수 있습니다 .
ps -ef | grep -e alice -e bob
그러면 alice
또는 가 포함된 줄이 인쇄됩니다 bob
. 파일에서 입력 목록을 얻으려면 이 -f
옵션을 사용할 수 있지만 이 경우 파일 이름이 필요합니다.
cat <<EOF >users.txt
alice
bob
END
ps -ef | grep -f users.txt
필터링 중인 텍스트는 표준 입력을 사용하므로 검색 모드에서 다시 사용할 수 없습니다. 여러 입력을 원하는 것은 일반적인 문제이므로 일부 셸(ksh, bash, zsh)은 솔루션을 제공합니다.프로세스 교체(이게 뭐야?돈 크리스티다음을 권장합니다.코멘트):
ps -ef | grep -f <(cat <<END
alice
bob
END
)
이 방법은 사용자 목록이 복잡한 명령으로 생성된 경우 유용하지만 하드코드된 목록을 사용하면 불필요하게 복잡해집니다. 즉, grep -e alice -e bob
동일한 작업을 수행합니다.
이 접근 방식의 문제점은 행의 어느 위치에서나 사용자 이름과 일치한다는 것입니다. 이 ps
명령에는 특정 사용자 그룹의 프로세스만 나열하는 옵션이 있습니다. 그냥 그걸 사용하세요.
ps -u alice,bob
사용 중인 임베디드 시스템의 버전이 ps
지원하지 않는 경우 지원 -u
하는지 확인 -o USER
하고 grep -x
전체 라인을 일치시켜 사용하십시오.
busybox ps -o user | grep -x -e alice -e bob
답변2
대체적으로 추천드리고 싶습니다자일스의 대답.
POSIX 규격을 준수하는 스크립트가 필요하지만 스크립트가 ps
이를 지원하지 않는 경우 -u
다음 방법을 사용할 수 있습니다.
ps -ef | grep -e \
"^smtpd
^dbus
^ntp"
ps -ef
즉, 파이프를 통해 출력됩니다 grep -e pattern_list
. Pattern_list는 각 패턴으로 시작하여 ^
줄의 시작 부분에 고정되는 여러 줄 문자열로 제공됩니다 .