Como executar comandos no login do usuário - que NÃO estão em execução

1

Frequentemente executo uma série de daemons de pessoas pobres quando estou entrando no meu servidor sem cabeçalho. Um para monitorar a cerveja em meus barris e um para monitorar o próprio servidor de um navegador da Web .

Eu faço isso executando ambos em screen :

screen -d -m psdash
screen -d -m kegbot runserver xxx.xx.x.xxx:8008

Ambos os comandos fora da tela tendem a dominar o stdout de tal forma que o resto da ssh session é impossível de usar. E eles também terminam com a sessão ssh , então eu achei a tela a melhor aposta.

A minha pergunta é a seguinte: existe uma forma em .profile ou outra coisa em que estes comandos sejam executados no início de sessão, mas NÃO são executados se já estiverem em execução? Este último pedaço me tem fora da minha profundidade.

    
por chow 06.12.2015 / 17:33

1 resposta

2

Sugiro escrever o PID (no bash que está em $! após iniciar um processo) em um arquivo, dos dois processos que você está iniciando ( psdash e kegbot ).

Você pode usar ps --pid $(cat your.pid) | tr -s ' ' | sed 1d | cur -d' ' -f4 para ver se o processo está sendo executado.

Assim como uma nota lateral, você deve sempre verificar se o PID dentro de um arquivo .pid é válido antes de agir sobre ele!

Pode acontecer de qualquer mecanismo que você use para remover o arquivo .pid quando seus programas forem interrompidos (normalmente isso seria parte do próprio programa ou um invólucro shellscript), e há um PID "errado" em o arquivo .pid . Se o arquivo .pid sobreviver a uma reinicialização, o pior cenário seria um PID de algum outro processo em que você atuaria.

OK, aqui está uma solução possível, usando o kegbot como exemplo:

Primeiro, você precisa de um script de wrapper. Para simplificar, vamos supor que tudo está acontecendo em seu $HOME .

Assim, um invólucro simples ( run_kegbot.sh ) seria:

#!/bin/zsh
kegbot runserver xxx.xx.x.xxx:8008
echo $! > kegbot.pid
wait
rm -rf kegbot.pid

Esta é uma solução, se o kegbot forks em segundo plano, etc., mas o PID é válido depois que ele é bifurcado. Eu não sei se kegbot é capaz de lidar com arquivos PID em si, o que aliviaria você ter que lidar com arquivos PID você mesmo. Ou talvez você possa fazer com que kegbot não seja bifurcado no plano de fundo e, em seguida, usar o próprio shell (adicionando & ao final da linha 2) para gravar o arquivo PID e aguardar sua conclusão.

De qualquer forma, uma vez que você tenha feito a malarkey do arquivo PID, você precisa de algo assim em seu .profile :

[ -e kegbot.pid ] && {
    PID=$(cat kegbot.pid)
    COMM=$(ps -p $PID -o comm=)
    [ "x$COMM" != "xkegbot" ] && rm -f kegbot.pid 
}

[ -e kegbot.pid ] || screen -d -m ./run_kegbot.sh

Mais uma vez, essa é apenas uma uma solução para o problema, mas a idéia geral é usar o PID do processo para verificar se está em execução ou não, e acima é uma maneira de fazer isso.

Alguns daemons mantêm seus arquivos PID em /var/run/ , se kegbot e / ou psdash fizerem isso, obviamente você não precisa de um script de wrapper, etc., pois você pode usar esses arquivos PID diretamente. / p>

Você definitivamente precisa verificar se o PID dentro de um arquivo PID é realmente o processo ao qual ele pertence. Uma reinicialização não autorizada e / ou o daemon travando pode deixar um arquivo PID zumbificado, etc. Isso é o que o primeiro teste do arquivo PID acima serve.

    
por 06.12.2015 / 17:59