Obrigado @Iain, @KyleSmith e @ M_1 pelas suas respostas e por me ajudar a começar a trabalhar com o Server Fault. Se eu tivesse mais rep aqui, eu teria +1 vocês. (Edit: agora eu tenho rep, + 1s ao redor).
Eu vou responder a minha própria pergunta porque eu encontrei algo que faz o que eu estava procurando: uma solução geral que evita a correspondência de padrões imprecisos com ps, e não usa arquivos pid. É completamente subjetivo que este seria o "melhor" caminho porque obviamente há uma história longa e bem-sucedida no unix de usar arquivos pid, no entanto, isso foi algo que eu disse explicitamente que não gostei por várias razões, e eles são: complicado criar adequadamente, diferente para cada software, feito de forma diferente em cada distribuição, pode ser obsoleto / substituído, e inerentemente não representa necessariamente o que realmente está acontecendo. Eu prefiro usar algum tipo de marcação de processo, perguntar ao kernel e obter respostas reais.
Exemplo reduzido:
#!/bin/sh
_TAG=d726cc7fa57a308afdc057b228a13f6d
case "$1" in
start)
_TAG=$_TAG ./self-backgrounding-process
_TAG=$_TAG ./non-self-backgrounding-process &
;;
stop)
pids=$(grep -l "\b_TAG=$_TAG\b" /proc/*/environ | cut -d/ -f3)
[ -n "$pids" ] && kill $pids
;;
esac
Os pontos principais são:
- usando um md5sum (algo muito improvável de ser correspondido acidentalmente) para a tag
- usando uma tag diferente no script de inicialização de cada serviço
- consultando / proc / * / environ para obter uma lista precisa de processos em execução / relevantes / marcados
- usando grep com \ b para corresponder aos limites das palavras para garantir uma correspondência exata
Não tenho certeza se gosto de poluir o ambiente, mas não sei de nenhuma outra forma (por exemplo, projetos do Solaris) para marcar um processo do Linux de uma maneira arbitrária que possa solicitar ao kernel para mais tarde. Pelo menos, / proc / < pid > / environ aparece como reflete o ambiente na inicialização e não é afetado por quaisquer alterações que o processo possa fazer após , o que sugere que isso deve ser confiável, no entanto, há a chance de que isso possa mudar inesperadamente. Isso pode ou não funcionar fora do Linux, dependendo da implementação do sistema operacional / proc e grep.
Acho que vou tentar por um tempo e ver o que acontece.