실행 중인 동안 compton을 종료하거나, 실행 중이 아니면 시작하는 스크립트를 만들려고 합니다. 나는 프로세스가 발견되면 1을 종료해야 한다는 내용을 읽었으므로 이를 사용하는 스크립트를 만들려고 시도했지만... 작동하지 않고 닫히면 시작되지만 닫히지 않습니다. 내가 뭘 잘못했나요? ?
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status
답변1
너예pgrep
변수 로 출력을 가져옵니다 status
. 이는 예상한 결과가 아닙니다.
pgrep
지정한 패턴과 일치하는 프로세스의 프로세스 ID(PID)를 인쇄합니다. 이름이 일치하는 프로세스가 있는 경우 해당 프로세스의 PID가 됩니다 compton
. 종료 상태도 반환되지만 명령 대체는 종료 상태를 문자열로 캡처하지 않습니다.$status
pgrep
테스트에서는 $status
와 비교할 것입니다 1
. PID가 compton
1일 가능성은 거의 없습니다.
compton
기존 프로세스를 종료 하고 compton -b
프로세스가 없으면 시작하려면 compton
다음을 사용할 수 있습니다.
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi
이는 종료 상태를 사용합니다 pkill
. 이 도구는 (보통 쌍으로 배포 및 설치됨) 동일하게 pkill
작동 하지만 이전과 같이 일치하는 프로세스의 PID를 출력하는 대신 기본적으로 일치하는 프로세스에 신호를 보냅니다 .pgrep
pgrep
pkill
TERM
이 if
키워드는 함께 사용되는 명령의 종료 상태를 사용합니다.
!
테스트의 의미를 뒤집어서
성공 하면
pkill compton
다음이 있음을 의미합니다.예전에는이제 하나 이상의compton
프로세스가 종료되었거나 최소한 신호를 받았으므로exec compton -b
실행되지 않습니다.실패할 경우
pkill compton
(이름과 일치하는 프로세스가 없거나 에 내부 오류가 있는 경우pkill
) 명령문 본문은if
yours 를 호출하여exec compton -b
셸 프로세스를 를 실행하여 생성된 프로세스로 대체합니다compton -b
.
답변2
$?에서 변수가 될 pgrep 프로세스의 종료 상태를 제어해야 합니다. 또는 pgrep 출력을 저장하는 $status 변수가 길이가 0이 아닌 문자열인지 확인하세요. 질문의 스크립트는 변수 상태의 문자열이 "1"인지 확인합니다.
그래서
#!/bin/bash
pgrep compton >/dev/null
if [[ $? -eq 0 ]]
then
killall compton
else
exec compton -b
fi
또는
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ -n "$status" ]]
then
killall compton
else
exec compton -b
fi