Existe uma variante do relógio que só é atualizada ao receber um sinal?

3

Eu tenho uma janela que executa um pouco caro watch git log ... encantamento - caro o suficiente para que realmente pareça mais com watch -n30 timeout 10 git log ... , de modo que não prejudique excessivamente meu sistema.

No entanto, isso não precisa ser executado a cada 30 segundos. Ele só precisa ser executado sempre que eu executar um comando git. Se watch o suportasse, eu poderia simplesmente enviar um sinal SIGUSR1 para watch sempre que eu quisesse atualizá-lo, e isso economizaria muito poder computacional.

Como posso conseguir isso?

    
por badp 14.12.2015 / 11:19

4 respostas

3

Isso pode ser um script de shell. Você precisa disso para:

  1. não faça nada o tempo todo
  2. executa um gancho em um sinal

Uma armadilha como trap 'git log' SIGUSR1 realizará 2. . 1. pode ser aproximadamente emulado com sleep $aLongTime e feito perfeitamente com:

tmp='mktemp'; echo 'int main(){ pause(); return 0; }' > "$tmp";
gcc -x c "$tmp" -o pause #create a 'pause' executable

Então seu script de shell pode ser:

echo $$ #identify self
trap 'git log' SIGUSR1 
while :; do ./pause; done
    
por 14.12.2015 / 11:52
1

Aqui está um pequeno programa python 2.6 para esse propósito:

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()
    
por 14.12.2015 / 11:53
0

Isso é um pouco sujo, mas funciona.

while :; do watch -n3600 git log ...; sleep 0.5; done

Isso depende do fato de que o relógio sai ao receber USR1. Sempre que o sinal é necessário, no entanto, uma mensagem de erro é gravada no terminal. Suprimi-lo com 2>/dev/null não funciona: faz com que watch pense que não está falando com um terminal e a mensagem "Sinal definido pelo usuário" ainda aparece.

O sono é necessário para deixar você ctrl-c do loop de forma limpa.

    
por 14.12.2015 / 11:22
0

Você pode criar uma função shell e chamá-la quando um determinado (ou vários) sinais são recebidos. watch é a ferramenta errada para o trabalho. Isso desencadeia quando um certo tempo passou. Você quer acionar não com base no tempo, mas em sinais.

Aqui está um script de shell simples que demonstra esse recurso:

#!/bin/sh

gitlog() {
  clear
  git log
}

while :; do
  trap gitlog USR1
done

exit 0

Teste com kill <PID> -SIGUSR1 . Você ainda pode matar esse script com ctrl - c .

    
por 14.12.2015 / 11:40

Tags