Onde colocar um script de segundo plano

1

Eu tenho um script que quero estar constantemente em execução em segundo plano, mas não sei onde iniciá-lo

Se eu colocar em .bashrc , ele será executado várias vezes (uma para cada login)

É um loop infinito que eu quero executar desde que um usuário esteja logado, mas não mais de uma vez para cada usuário.

    
por jsj 04.03.2013 / 04:27

4 respostas

1

Quando bash(1) é executado como um shell de login (ou seja, quando o usuário faz login), ele executa /etc/profile , ~/.bash_profile , ~/.bash_login e ~/.profile , a menos que seja chamado com --no-profile . Começar seu script de lá deve fazer o truque.

    
por 04.03.2013 / 18:33
3

Seu script deve verificar se há apenas uma instância. Tente algo assim:

#!/bin/bash

mkdir ~/.lock_script || exit
trap "rmdir ~/.lock_script" EXIT

while true
do
    # Do whatever the script does continuously, here....
    #
done

O comando trap cuida da limpeza na saída, portanto, mesmo que o script seja eliminado ou terminado, ele será limpo. Nenhum processo pode capturar (interceptar) o sinal TERM (Sinal 9), portanto, se você kill -9 do script, ele não será limpo após ele mesmo.

O mkdir é uma operação atômica no que diz respeito ao kernel. Se o mkdir não tiver êxito (por exemplo, se o diretório já existir), o comando retornará um erro, o que faz com que a segunda metade do comando seja executada - por exemplo, sair.

Você pode ler o comando como "mkdir or else exit" - é melhor explicado aqui: link

Eu também sugiro que você não use while true desta forma - tente se possível pensar em outra maneira de fazer o que você quer fazer.

    
por 04.03.2013 / 08:33
1

Você pode adicionar mais uma condição conforme abaixo:

adicione em .bashrc

export my_script_pid=myscript.${USER}
[[ ! -f $my_script_pid ]] && { touch $my_script_pid; echo run-script; } || echo "script already running"

depois, no seu script, adicione rm $my_script_pid no último.

    
por 04.03.2013 / 07:09
0

Você pode executar o script e obter os registros do comando abaixo:

nohup /path/to/your/script.sh > /dev/null 2>&1 &

Ele também fornecerá a saída.

    
por 04.03.2013 / 07:59