쉘을 시작할 때 프로그램이 실행 중인지 확인하고 아직 실행 중이 아닌 경우 해당 프로그램을 시작하려면 어떻게 해야 합니까?

쉘을 시작할 때 프로그램이 실행 중인지 확인하고 아직 실행 중이 아닌 경우 해당 프로그램을 시작하려면 어떻게 해야 합니까?

제 경우에는 bash 및/또는 zsh에서 쉘을 시작할 때 프로그램이 이미 실행 중인지, 프로그램이 아직 실행 중이 아닌지 확인하기 위해 .zshrc 및/또는 .bashrc에 어떤 줄을 추가해야 합니까? 시작해?

예: 새로운 zsh 쉘을 시작하고 있습니다. top이 아직 실행 중이 아닌 경우 top을 시작하여 쉘을 인수하게 하고 싶습니다. top이 이미 다른 창에서 실행 중인 경우 .zshrc를 계속 로드하여 열린 터미널을 제공하고 싶습니다.

6-16 업데이트:

if ! pgrep -U $USER top >/dev/null; then
exec top
fi

위의 스크립트는 내 요청을 만족시킵니다. -q 플래그는 내 시스템에서 옵션이 아니기 때문에 작동하지 않습니다. 그래서 PID를 /dev/null로 파이프해야 했습니다. Mveroone, Kusalananda, Thomas Dickey에게 감사드립니다.

원래 질문의 범위를 벗어나는 일부 기능 크립이 있습니다. 암호를 입력하지 않고도 루트가 될 수 있는 단일 사용자 시스템에 있다고 가정해 보겠습니다. 필요한 경우 루트로 top을 자동 실행하려면 어떻게 해야 합니까?

6-18 좋습니다. 루트로 명령을 전달하는 기능 크리프 문제가 해결되었습니다. 나는 이것을 여러 개 실행하는 데 사용하고 있습니다.

모든 사려 깊은 답변에 감사드립니다.

답변1

다음과 같이 사용하세요 pgrep:

if ! pgrep -u $USER top >/dev/null 2>&1; then
    exec top
fi

설명:

  • 명령이 실행 중인 것으로 확인되면 유틸리티 pgrep는 0 종료 코드로 종료됩니다. 따라서 테스트를 무효화합니다.
  • 또한 를 사용하여 현재 사용자로 제한하여 -u $USER어떤 이유로든 다른 사람의 프로세스를 선택하지 않도록 합니다. $USER표준 쉘 변수입니다. 어떤 이유로 정의되지 않은 경우 $LOGNAME대신 사용해 보세요. 실패하면 사용하세요 (그러나 그 시점에서 무슨 일 이 $( id -n -u )일어나고 있는지 스스로에게 물어봐야 합니다.$LOGNAME또한표준 쉘 변수).
  • 의 출력이 필요하지 않으므로 pgrep표준 출력 및 오류 스트림을 로 리디렉션합니다 /dev/null.

top(또는 무엇이든) 실행 중이 아닌 경우 execOP의 질문에 따라 셸을 교체합니다.

sh이는 모든 호환 쉘 에서 작동해야 합니다 .

편집: pgrepBSD 시스템(OS X, OpenBSD 등)의 구현에는 -q출력을 삭제하는 옵션이 있지만 pgrepLinux에는 분명히 이 플래그가 없습니다. BSD 시스템에서는 약간 보기 흉한 리디렉션 대신 이것을 사용하십시오 /dev/null.

답변2

프로그램이 항상 셸에서 시작되고 사용자가 프로그램을 완전히 제어할 수 있는 경우(즉, 타사 프로그램 내부에 하드코딩되지 않은 경우) lockfile또는 와 같은 일부 잠금 메커니즘을 사용할 수 있습니다 flock. 예를 들어

flock -n /tmp/top -c top

.bashrc/ 에 .zshrc셸의 첫 번째 인스턴스만 명령을 실행하도록 합니다 top(해당 명령을 종료하지 않으면 다른 인스턴스가 시작됩니다).

(셸 초기화 시뿐만 아니라) 직접 명령을 시작할 수 있도록 함수를 생성할 수도 있습니다.

mytop () { flock -n /tmp/$0 -c top; }

그리고 mytop원할 때마다 달리세요.

답변3

그것이 pgrep가는 길에 동의하지만 몇 가지 함정이 있습니다. 이를 제거하기 위해 -q의 출력을 리디렉션할 수 있으므로 이 옵션을 사용할 필요가 없습니다 .pgrep

pgrep -U $USER top >/dev/null || exec top

함정은 표준 유틸리티가 아니라는 사실에 있으므로 이식성이 없을 수도 있다는 점을 명심해야 합니다. 다음은 도움이 되는 몇 가지 맨페이지 링크입니다.

환경 USER변수는 더 잘 확립되어 있지만 쉘에 대한 POSIX 목록에는 없는 것 같습니다(참조:2.5.3 쉘 변수). 오히려 USER사용 중인 것으로 알려진 많은 변수 중 하나임을 기록합니다(참고 사항 참조).8.1 환경변수 정의).

이것은 다음 top과 같이 실행됩니다.당신 자신, 물론. 다음과 같이 실행하도록 선택한 경우뿌리$USER으로 변경한 다음 (선호) 또는 를 사용하여 root실행할 수 있습니다 . POSIX에도 없습니다(topsudosu목록 보기). 후자( su)는 Unix 계열 시스템 어디에서나 사용할 수 있지만 sudo일반적으로 선호됩니다. 그래서 당신은

pgrep -U root top >/dev/null || exec sudo top

비밀번호를 요구하지 않도록 구성하지 않은 경우 sudo쉘이 시작될 때 비밀번호를 묻는 메시지가 표시됩니다 top.

답변4

내 .zshrc(또는 기타)에 다음과 같은 조각을 추가하겠습니다.

pgrep -u $USER 프로그램_이름인 경우
그 다음에
    실행 프로그램_이름
fi

주의사항:이 코드는 테스트하지 않았습니다. 루트나 서버에 있는 유일한 사용자에게는 사용하지 마십시오. 실패하면 복구할 수 있는지 확인하세요.

관련 정보