Executa um processo somente para o pid específico / dedicado

5

Eu tenho um script ou shell script do programa c que eu quero executar com muita freqüência. Se eu quiser parar / pausar ou notificar algo, enviarei um sinal para esse processo. Então, toda vez que eu tenho que verificar o pid desse processo e eu tenho que usar kill para enviar um sinal.

Toda vez que eu tenho que verificar pid e lembrar que até o desligamento do sistema, muito ruim. Eu quero que o processo tenha que ser executado somente em pid como init sempre executado em 1.

Existe algum api para isso? e também script necessário para o programa bash.

    
por gangadhars 22.05.2014 / 14:10

5 respostas

8

Eu não acho que você possa reservar ou atribuir PIDs. No entanto, você pode iniciar seu processo em um script como este:

myprocess &
echo "$!" > /tmp/myprocess.pid

Isso cria um "arquivo pid", como algumas outras pessoas referiram a ele. Você pode buscar isso no bash com, por exemplo, $(</tmp/myprocess.pid) ou $(cat /tmp/myprocess.pid) .

Apenas tome cuidado quando você fizer isso, se o processo morrer e o pid for reciclado, você estará sinalizando a coisa errada. Você pode verificar com:

pid=$(cat /tmp/myprocess.pid)
if [ "$(ps -o comm= -p "$pid")" = "myprocess" ]; then
    ...send your signal...
else echo "Myprocess is dead!"
fi

Veja os comentários se "$(ps -o comm= -p "$pid")" parecer estranho para você. Você pode querer fazer uma validação mais vigorosa se houver a chance de alguém fazer algo desonesto com o conteúdo de /tmp/myprocess.pid (que não deve ser gravável por outros usuários!).

    
por 22.05.2014 / 14:38
5

Corrigir o pid é definitivamente a solução errada para o seu problema, mas observe que com algumas versões do Linux, você pode obter uma melhor chance de obter o pid que deseja escrevendo um valor para /proc/sys/kernel/ns_last_pid :

echo 9999 | sudo tee /proc/sys/kernel/ns_last_pid; ps -C ps
9999
  PID TTY          TIME CMD
10000 pts/3    00:00:00 ps

Isso só funciona se o pid 10000 não estiver em uso (e não houver criação de pid ou thread entre o momento em que você escreve em ns_last_pid e você gera um processo / thread).

Caso contrário, você pode sempre bifurcar até obter o pid de que gosta.

    
por 23.05.2014 / 08:53
3

Algo semelhante ao que você deseja fazer normalmente é feito pelo processo no início de seu ciclo de vida, escrevendo seu próprio pid (que pode ser obtido através de getpid(2) ) em um arquivo com um nome conhecido. Em daemons de uso geral, o nome deste arquivo é muitas vezes configurável, mas em um software de uso especial você provavelmente pode se dar bem com o hardcoding. (Eu sugiro strongmente, pelo menos, usando uma macro para isso, no entanto.)

Arquivos PID são normalmente colocados em / var / run ou / run, mas podem ser colocados em outros locais, incluindo / tmp. O local "apropriado" de acordo com o Filesystem Hierarchy Standard está em / run, mas / var / run também vê uso significativo (e em muitos sistemas modernos é o mesmo que / run) e / tmp não requer privilégios de root na inicialização ( quais daemons do sistema costumam ter antes de perder privilégios).

Esse arquivo pode então ser lido através de uma variedade de meios para obter o PID do processo em questão, a fim de enviar um sinal para o processo em questão.

    
por 22.05.2014 / 14:40
1

Você não pode definir o PID, mas pode definir o PGID: criar ou participar de um grupo de processos . Então você pode enviar sinais para este grupo de processos dedicado.

Tive a impressão de que o novo sistema systemd init tem alguma automação nessa parte, o que é superior a ter o processo para gravar seu PID em um arquivo PID e usá-lo para controlá-lo.

systemd parece mudar para um "grupo de processos" (como eu posso entender isso) antes de iniciar um processo controlado, e então tudo está nesse grupo. Assim, você pode controlar todos os processos filhos lembrando o "grupo" especial.

  • Se funcionar, é melhor ter o processo para escrever seu PID, porque você não precisa modificar o programa.

  • Também pode ser melhor:

    myprocess & eco $! > /tmp/myprocess.pid

porque essa abordagem também captura todos os filhos desse processo.

Eu não tenho uma documentação detalhada disponível para apoiar minhas palavras, mas aqui é a idéia geral do que systemd precisa dos cgroups, e isso parece combinar com a minha impressão:

Control Groups are two things: (A) a way to hierarchally group and label processes, and (B) a way to then apply resource limits to these groups. systemd only requires the former (A), and not the latter (B). That means you can compile your kernel without any control group resource controllers (B) and systemd will work perfectly on it. However, if you in addition disable the grouping feature entirely (A) then systemd will loudly complain at boot and proceed only reluctantly with a big warning and in a limited functionality mode.

    
por 23.05.2014 / 11:54
-1

O daemon do nível do sistema é atribuído de acordo com a sequência de inicialização durante o tempo de inicialização. Acredito que atribuir um pid fixo a determinado processo não é possível porque está sendo atribuído pelo Kernel de acordo com a carga do sistema e outras dependências.

Mas, usando a chamada do sistema, podemos atribuir um PID fixo ao processo. Mas não faço ideia de como isso pode ser alcançado.

    
por 22.05.2014 / 14:27