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.

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 .


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 &

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.


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) &

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.


0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.