Iniciando um processo Linux em segundo plano

10

Estou tentando criar um script que inicia alguns programas

startup.sh

knetworkmanager
emesene
keepassx

O problema é que, quando executo o script, ele inicia apenas o knetworkmanager. Isso ocorre porque ele será iniciado e espere até que termine. Como posso iniciar um programa sem esperar por ele? Eu não acho que posso apenas adicionar "&" após cada comando, porque todos os processos ainda serão eliminados quando o script for concluído.

Bart van Heukelom
fonte

Respostas:

16

Quando o shell que executa o script sai, ele envia um sinal HUP para os processos que você iniciou. Se eles não capturarem o sinal, eles terminarão. Portanto, se apenas usar & é suficiente depende do aplicativo. Para estar seguro, use nohup assim:

nohup your-program >>/dev/null 2>>/dev/null &

Veja as páginas de manual para nohup e kill para mais detalhes ou leia o artigo da wikipedia sobre nohup .

Kim
fonte
Lendo novamente, é ambíguo se o OP está saindo do shell de chamada ou não. Ele apenas menciona sair do script, não sair do shell ou do terminal.
23411 Adam Bellaire
Ao ler minha resposta novamente, você notará que eu disse "quando o shell que executa o script sai". Supondo que este shell tenha seu próprio terminal virtual (não um subshell ou algo assim), isso está correto.
Kim
@ Kim: Isso é verdade. Sua resposta é boa, tenho certeza se o OP está fechando o shell de chamada ou não.
23411 Adam Bellaire
10

Não, os processos não devem ser eliminados quando o script terminar, se você usar &. Tente.

knetworkmanager &
emesene &
keepassx &
Adam Bellaire
fonte
2

Com base nos exemplos de programas que você deu, parece que você está tentando iniciar alguns programas quando o KDE é iniciado. Nesse caso, dê uma olhada no recurso Autostart do KDE. Este artigo discute mais e fornece instruções sobre como adicionar programas à inicialização automática.

Doug Harris
fonte
Na verdade, é isso que estou tentando fazer. Corrigi agora, obrigado.
Bart van Heukelom
1

Como já foi dito, use o &operador para colocar um comando em segundo plano no momento em que o shell o executa.

Se você deseja que as peças do componente sejam executadas em ordem (e não de maneira simultânea), mas ainda deseja que o todo seja em segundo plano, use um subcasca como este:

(knetworkmanager; emesene; keepassx) &

ou, se você desejar que a operação de cada peça seja condicionada à conclusão bem-sucedida da peça anterior, use:

(knetworkmanager && emesene && keepassx) &
dmckee --- gatinho ex-moderador
fonte
0

Adicionar um '&' após cada comando definitivamente funcionará. Isso significaria que esses scripts ou programas continuariam sendo executados mesmo após a conclusão do startup.sh.


fonte
0

Outra opção seria iniciar o processo como um daemon, usando / sbin / start-stop-daemon

Abhinav
fonte