첫 번째 실행을 기다리지 않고 명령 반복

첫 번째 실행을 기다리지 않고 명령 반복

나는 주로 명령줄 사용을 위해 이 작업을 수행하는 더 나은 방법을 원합니다.

while sleep 60; do 
  mysql -e 'show processlist'; 
done

이것은 다음보다 낫습니다:

while mysql -e 'show processlist'; do
  sleep 60;
done

...a를 입력하면 ctrl-c중지되기 때문입니다. 그러나 첫 번째 버전은 처음으로 출력하기 전에 1분 정도 기다립니다.

에 대해 알고 있습니다 watch. 일반적으로 좋지만 모든 상황에 적합하지는 않습니다. 저주하지 않고 stdout으로 간단한 출력을 찾고 있습니다. watch옵션이 있으면 좋을 것 같습니다 --stdout.

여기서는 단순함이 핵심입니다. 나는 mysql 문의 오류 처리에 관심이 없습니다. 자체 오류를 표준 출력으로 보고할 수 있습니다.

답변1

Ctrl+는 C정상적인 상황에서 전체 루프를 종료합니다. 신호는 전체 전경 프로세스 그룹으로 전송됩니다.

당신은 찾고있을 수 있습니다

while mysql -e 'show processlist' && sleep 60; do :; done

한 번 종료 mysql하거나 sleep실패하면 종료합니다.

답변2

이것은 당신에게 도움이 될 수 있습니다:

trap "pkill -TERM -P $$" SIGINT

while [ 1 ]; do
   mysql -e 'show processlist'
   sleep 60
done

답변3

글쎄, 당신의 예를 들면 ...

n=; while sleep "$((n&(n=60)))"
do   mysql...
done

...할 거예요. 처음에만 수행 sleep 0하고 나머지 부분에서도 수행합니다 sleep 60. 그래도 최종 목표를 달성하기 위해서는 이보다 더 좋은 방법이 있을 것이라고 생각합니다.

이와 같은 것을 사용한다면 아마도 함수에서 사용하고 싶을 것입니다.

every_minute() ( n=
    while sleep "$((n&(n=60)))"
    do "$@"; done)

...또는 한 줄로...

every_minute() (n=; while sleep "$((n&(n=60)))"; do "$@"; done)

쉘의 rc 파일에 이와 같은 것을 넣으면 다음과 같이 할 수 있습니다.

every_minute mysql "$whatever" "$args" "$you" "$use"

...또는 프롬프트에 한 줄 버전을 입력하고 쉘이 닫힐 때까지 계속 사용할 수 있습니다.

관련 정보