Como posso gravar periodicamente a pilha de dirs e as tarefas de um shell sem ocupar o shell?

0

Eu tenho um script

$ cat my.sh 
#! /bin/bash -
dirs -l > /tmp/test/dirs_record
jobs > /tmp/test/jobs_record

Então, quando eu source ./my.sh , ele irá gerar a pilha de diretórios e jobs no shell de chamada.

Eu tenho outro script schedule.sh

#! /bin/bash -
while : ; do eval "${@}" ; sleep 10 ; done

A execução de source schedule.sh source ./my.sh em um shell bash pode periodicamente grava a pilha e as tarefas dir na shell bash de chamada.

Mas eu quero executar outros comandos no mesmo shell, e quero que source schedule.sh source ./my.sh registre a pilha de diretórios atualizada e as tarefas periodicamente, então coloquei em segundo plano source schedule.sh source ./my.sh & e, em seguida, em jobs e dirs estão sendo executados em um subshell em vez do invocando shell, qualquer alteração nos jobs ou na pilha dir do shell invocador não será registrada. Veja Por que 'empregos' e 'dirs' executados em comandos de subsituição, substituição de processos, pipeline e trabalhos de segundo plano são iguais aos do shell original?

Como posso gravar periodicamente a pilha de dirs e as tarefas de um shell sem ocupar o shell? Por exemplo, posso executar uma tarefa em segundo plano diretamente no shell de chamada?

Obrigado.

    
por Tim 02.08.2018 / 18:46

1 resposta

1

Você pode fazer isso com um sinal trap e executando o modo de espera & & matar no fundo:

$ cat monitor.sh
# monitor stuff in the background

# ensure this file is sourced, not executed: http://mywiki.wooledge.org/BashFAQ/109 
sourced() { [[ ${FUNCNAME[1]} == "source" ]]; }
sourced || { echo "source me"; exit 1; }
unset -f sourced

__MY_PID=$$

trap __usr1_trap USR1

__usr1_trap() {
    dirs -l >| /tmp/test/dirs_record
    jobs    >| /tmp/test/jobs_record
    __schedule_trap &
}

__schedule_trap() {
    sleep 60
    kill -USR1 $__MY_PID
}

# trigger the signal handler, which will reschedule itself
kill -USR1 $__MY_PID

Inicie com . /path/to/monitor.sh

Observe que eu uso >| como o operador de redirecionamento no manipulador de sinal porque eu corro com set -o noclobber para evitar a substituição acidental de arquivos: aqui queremos sobrescrever os arquivos propositalmente.

    
por 02.08.2018 / 21:23