Se o servidor estiver sendo executado como um usuário dedicado, você poderá manter uma cópia de /bin/kill
que é setuid para esse usuário. Isso só funciona se o usuário não for usado para mais nada, porque um binário setuid kill
permite enviar um sinal para qualquer processo em execução como esse usuário. Um wrapper setuid que verifica o PID antes de matar não é realmente factível: não há como examinar programas em execução sem uma condição de corrida.
A outra maneira de abordar isso é ter um programa de monitoramento que seja executado como o mesmo usuário que o servidor e esteja preparado para matar o servidor, com uma condição de acionamento que não esteja vinculada à conta do usuário. O programa de monitoramento precisa ser o pai do servidor para poder matá-lo de maneira confiável sem arriscar uma condição de corrida. O gatilho pode ser algo como escrever para um pipe. Prova de conceito:
#!/bin/sh
SimpleHTTPServer &
server_pid=$!
read </var/lib/myserver/kill
kill "$server_pid"
Para configurar:
mkdir /var/run/myserver
mkfifo -m 660 /var/run/myserver/kill
chown server-user /var/run/myserver/kill
chgrp server-killers /var/run/myserver/kill
Para matar o servidor, qualquer usuário no grupo server-killers
pode executar echo >/var/run/myserver/kill
.