leva entrada em padrão em:
$ echo 'find / -name *.mp3 > ~/desktop/all_musics.md 2>/dev/null' | at now + 10 minutes
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?
leva entrada em padrão em:
$ echo 'find / -name *.mp3 > ~/desktop/all_musics.md 2>/dev/null' | at now + 10 minutes
find /
para pesquisar todos os arquivos em todo o seu sistema não é eficiente, você deve restringir seu caminho de pesquisa.
Suponha que:
~/Downloads/misc/mp3/
~/Downloads/misc/mp3/my_mp3.list
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. 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. ( 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. --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:
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
.
Guarde isto no seu /tmp/test.sh
:
. /tmp/d.sh
mpv --player-operation-mode=pseudo-gui foo.mp3
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
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.
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) &
Tags bash