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

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

제 경우에는 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(또는 그렇지 않으면) 실행 중인 것으로 발견되지 않으면 OP exec의 질문에 따라 셸을 대체합니다.

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

편집: pgrepBSD 시스템(OS X, OpenBSD 등)의 구현에는 -q출력을 삭제할 수 있는 옵션이 있지만 pgrep이 플래그는 Linux에서는 사용할 수 없는 것 같습니다. 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변경할 . rootPOSIX에는 둘 다 존재하지 않습니다(topsudosu목록 보기). 후자( su)는 Unix 계열 시스템 어디에서나 사용할 수 있지만 sudo일반적으로 선호됩니다. 그래서 당신은 가질 것입니다

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

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

답변4

내 .zshrc(또는 무엇이든)에 다음과 같은 조각을 추가하겠습니다.

if pgrep -u $USER 프로그램 이름
그 다음에
    실행 프로그램 이름
필리핀 제도

경고하다:아직 이 코드를 테스트하지 않았습니다. 루트 또는 서버의 유일한 사용자에서는 이 기능을 사용하지 마십시오. 장애 복구를 보장합니다.

관련 정보