watch git log ...
나는 약간 비싼 주문을 실행하는 창을 가지고 있습니다 . 실제로는 이렇게 보일 정도로 비싸서 watch -n30 timeout 10 git log ...
시스템에 너무 많은 해를 끼치 지 않습니다.
그러나 이 작업을 30초마다 실행할 필요는 없습니다. git 명령을 실행할 때만 실행하면 됩니다. 지원 된다면 watch
업데이트하고 싶을 때마다 SIGUSR1 신호를 보낼 수 watch
있어 컴퓨팅 성능이 많이 절약될 것입니다.
이 목표를 어떻게 달성할 수 있나요?
답변1
이는 쉘 스크립트일 수 있습니다. 다음을 수행하는 데 필요합니다.
- 아직도 아무것도 안 하고
- 신호에 대한 후크 실행
그러한 함정은 trap 'git log' SIGUSR1
완성될 것입니다 2.
.
1.
대략적으로 시뮬레이션하고 완벽하게 완료할 수 있습니다
sleep $aLongTime
.
tmp=`mktemp`; echo 'int main(){ pause(); return 0; }' > "$tmp";
gcc -x c "$tmp" -o pause #create a `pause` executable
그러면 쉘 스크립트는 다음과 같을 수 있습니다.
echo $$ #identify self
trap 'git log' SIGUSR1
while :; do ./pause; done
답변2
다음은 이 목적을 위한 작은 Python 2.6 프로그램입니다:
import signal,sys,os
cmdString = " ".join(sys.argv[1::]).strip()
def handler(sig,frame):
if sig == signal.SIGUSR1:
refresh()
elif sig == signal.SIGINT:
print 'You pressed Ctrl+C!'
sys.exit(0)
def refresh():
os.system(cmdString)
print "\n"
signal.pause()
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGUSR1, handler)
print('Press Ctrl+C to exit')
refresh()
답변3
조금 더러워졌지만 작동합니다.
while :; do watch -n3600 git log ...; sleep 0.5; done
이는 USR1이 수신되면 시계가 종료된다는 사실에 의존합니다. 그러나 신호가 필요할 때마다 오류 메시지가 터미널에 기록됩니다. 이를 억제해도 2>/dev/null
아무런 효과가 없습니다. watch
터미널과 통신하지 않는 것처럼 보이고 "사용자 정의 신호" 메시지가 계속 나타납니다.
주기를 깔끔하게 조절하기 위해서는 수면이 필요합니다.
답변4
쉘 함수를 생성하고 특정 신호가 수신되면 호출할 수 있습니다. watch
작업에 적합한 도구가 아닙니다. 일정 시간이 지나면 발동됩니다. 시간이 아닌 신호를 기준으로 트리거하고 싶습니다.
다음은 이 기능을 보여주는 간단한 셸 스크립트입니다.
#!/bin/sh
gitlog() {
clear
git log
}
while :; do
trap gitlog USR1
done
exit 0
테스트를 위해 - 를 사용하여 스크립트를 종료 kill <PID> -SIGUSR1
할 수 있습니다 .ctrlc