Disown / background um comando passado para o bash

1

TL; DR na parte inferior.

Estou tentando fazer uma tela de bloqueio simples para o meu laptop executando Arch / BSPWM. Eu encontrei um programa chamado cmatrix que tem um sinalizador de tela que faz com que ele saia quando uma tecla é pressionada. Eu estou tentando encadear comandos bspc com cmatrix e vlock para fazer uma linha que pode ser executada para iniciar cmatrix fullscreen, executar vlock quando as teclas são pressionadas e, em seguida, sair após o vlock sair.

Meu único problema com isso é que, para que a tela de bloqueio seja eficaz, eu preciso sair do sxhkd para evitar que as pessoas simplesmente fechem a janela contendo cmatrix / vlock. Eu adicionei pkill sxhkd à cadeia de comandos e isso funciona. A parte quebrada está iniciando o sxhkd novamente. Simplesmente colocar o sxhkd no final não funciona, pois a janela do terminal não fecha até que o sxhkd termine, o que nunca acontece. Além disso, se a janela do terminal estiver fechada, o sxhkd pára porque estava sendo executado.

Eu tentei usar "sxhkd &", mas por algum motivo isso faz com que a coisa toda não seja executada.

Aqui está o comando quase funcional que tenho até agora:

urxvtc -e bash -c "sleep 0.1; pkill sxhkd; sleep 0.1; bspc window -t fullscreen=on; sleep 0.1; cmatrix -u 9 -s; sleep 0.1; vlock; sleep 0.1; sxhkd"

Os comandos sleep são para que os programas não apareçam na ordem errada (às vezes o prompt de senha do vlock aparece antes que o cmatrix seja executado)

O que ele faz atualmente é iniciar uma nova janela do urxvt (importante se eu quiser minha fonte terminal para o cmatrix) e mata o sxhkd para impedir que alguém feche a janela. Faz a tela cheia usando o bspc e roda o cmatrix. Quando uma tecla é pressionada, o cmatrix sai e os prompts de senha do vlock aparecem. Quando a senha é digitada corretamente, ela tenta reiniciar o sxhkd, mas eles permanecem acoplados.

Qualquer ajuda seria muito apreciada!

TL; DR

Como eu posso, com um comando (geralmente executado a partir de um script), abrir uma janela de terminal que executa outros comandos e iniciar um aplicativo (como um aplicativo gui), a janela do terminal fecha, mas o aplicativo gui continua em execução?

Exemplos de comandos mais simples :

urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol" Isso deve imprimir olá !, aguarde 3 segundos, em seguida, inicie o pavucontrol e feche o terminal, deixando o pavucontrol. Em vez disso, o terminal fica aberto porque o pavucontrol está funcionando.

urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol &" Isso deve imprimir olá !, aguarde 3 segundos, em seguida, inicie o pavucontrol e feche o terminal, deixando o pavucontrol. Quando o terminal fecha após 3 segundos, no entanto, o pavucontrol está longe de ser visto.

    
por Stephen Smith 11.01.2015 / 19:40

2 respostas

1

Eu pareço ter tropeçado na solução ao jogar com nohup sozinho. Parece que nohup não libera completamente o trabalho do terminal, então rodar nohup program & exit não funciona - o terminal reclama que há trabalhos em execução. A solução fácil é adicionar outro sono entre eles da seguinte forma:

nohup command & sleep 2 && exit

O sono provavelmente pode ser reduzido um pouco, mas se for muito curto provavelmente fará com que o programa não seja fechado.

Edit: Estou tendo um comportamento inconsistente com nohup e exit - às vezes ele sai e deixa o programa rodando e às vezes ele reclama que existem jobs. Não sei por que isso acontece.

    
por 11.01.2015 / 21:20
0

Para iniciar e tornar órfão um processo em segundo plano, use nohup my_command & . Depois disso, você pode exit do shell inicial sem matar o novo processo. Mais sobre gerenciamento de processos.

    
por 11.01.2015 / 20:47

Tags