Executa comandos a uma hora especificada [duplicado]

1

Eu aprendo o comando at schedule para executar um script em um horário especificado

at -f -m ./test.sh now + 10 minutes

Como eu poderia usar at para agendar um command ?

Suponha a situação,

Pesquisei todas as músicas, mas corri silenciosamente no plano de fundo

find / -name *.mp3 1> ~/desktop/all_musics.md 2>/dev/null &

Eu pretendo abrir all_musics.md dez minutos depois automaticamente.

open all_music.md at now + 10 minutes

É possível fazer isso?

    
por JawSaw 29.10.2018 / 04:46

2 respostas

0

leva entrada em padrão em:

$ echo 'find / -name *.mp3 > ~/desktop/all_musics.md 2>/dev/null' | at now + 10 minutes
    
por 29.10.2018 / 05:02
0

find / para pesquisar todos os arquivos em todo o seu sistema não é eficiente, você deve restringir seu caminho de pesquisa.

Suponha que:

  • Seu caminho de pesquisa de mp3 é ~/Downloads/misc/mp3/
  • encontrar resultado salvar no caminho da lista de reprodução ~/Downloads/misc/mp3/my_mp3.list
  • Seu sistema executando o ambiente de desktop gnome
  • mpv player instalado no seu sistema.

Você pode executar este comando de uma linha:

sudo service atd start;
(find ~/Downloads/misc/mp3/ -type f -iname '*.mp3' -print0 2>/dev/null >~/Downloads/misc/mp3/my_mp3.list &);
echo 'export "XDG_CURRENT_DESKTOP=GNOME";
export "GNOME_DESKTOP_SESSION_ID=this-is-deprecated";
export "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus";
export "DISPLAY=:0";
cat ~/Downloads/misc/mp3/my_mp3.list | xargs -0 mpv --player-operation-mode=pseudo-gui' | at now + 1 minute

Explicação:

  • sudo service atd start; start atd daemon, caso o deamon não seja executado ainda.
  • at now + 1 minute não significa reproduzir áudio após um minuto, mas significa tocar no minuto seguinte do minuto atual, então o tempo decorrido é na verdade menor ou igual a 1 minuto.
  • Garante o fornecimento do caminho completo, pois at task irá cd para o caminho original quando especificar at dessa vez. Não funcionará se o caminho relativo de destino não for esse caminho. Você saberá disso se fizer at -c <pending_job_number> para consultar o conteúdo do script de shell. Execute atq para saber o número de trabalhos pendentes.
  • O truque ( 2>/dev/null &); pode suprimir qualquer saída extra para o seu terminal.
  • -print0 e xargs -0 juntos tornam o nome do arquivo reproduzível, apesar de conter um caractere especial de nova linha.
  • Você precisa de --player-operation-mode=pseudo-gui , pois o mp3 é somente de áudio e não há um pop-up de gui de vídeo por padrão para permitir o controle. E não coloque xargs -o , ele não funcionará em atd .
  • XDG_CURRENT_DESKTOP , GNOME_DESKTOP_SESSION_ID , DBUS_SESSION_BUS_ADDRESS e DISPLAY são variáveis de ambiente importantes no ambiente de área de trabalho GNOME para fazer com que alguns aplicativos GUI funcionem corretamente e possam exibir. Para mpv para reproduzir mp3, a variável crítica é DISPLAY .

Assim como em outros daemon, como o cron, atd também não possui variáveis de ambiente para fazer o aplicativo gui funcionar corretamente, conforme descrito em man at :

For both at and batch, commands are read from standard input or the file specified with the -f option and executed. The working directory, the environment (except for the variables BASH_VERSINFO, DISPLAY, EUID, GROUPS, SHELLOPTS, TERM, UID, and _) and the umask are retained from the time of invocation

DISPLAY pode não ser suficiente para outros aplicativos de GUI, nesse caso, para descobrir as variáveis de ambiente necessárias para o seu programa em seu sistema sem entrar no código-fonte:

  1. Execute declare -p > /tmp/d.sh para salvar atributos e valores do nome da variável de ambiente. env > /tmp/d.sh removerá as cotações e não é adequado para direcionar reutilização, essa é a razão pela qual sugiro usar declare -p > /tmp/d.sh .

  2. Guarde isto no seu /tmp/test.sh :

    . /tmp/d.sh
    mpv --player-operation-mode=pseudo-gui foo.mp3
    
  3. E teste esse script continuamente. Se ele conseguir reproduzir corretamente, diminua a metade de /tmp/d.sh delete ou então desfaça o conteúdo excluído e tente excluir outra parte. Mas garante que você não exclua metade da declaração declare . E você não precisa excluir DISPLAY , que normalmente é exigido pelo aplicativo GUI.

    env -i bash /tmp/test.sh

  4. Eventualmente, você pode obter var (s) de env crítico para o seu programa. O conceito é env -i removido de todas as variáveis de ambiente, então fonte suas variáveis de ambiente restantes.

  5. Este método não garante que todas as funções funcionem corretamente, por ex. programa lento para inicialização, uma vez que algumas funções podem requerer variáveis diferentes. Você precisa repetir as etapas para descobrir essa função.

Além disso, não esqueça do comando sleep :

( (find ~/Downloads/misc/mp3/ -type f -iname '*.mp3' -print0 2>/dev/null >~/Downloads/misc/mp3/my_mp3.list) & pid=$!; sleep 600; kill -9 $pid 2>/dev/null; cat ~/Downloads/misc/mp3/my_mp3.list | xargs -0 mpv --player-operation-mode=pseudo-gui) &
    
por 29.10.2018 / 14:14

Tags