Existe um método padrão, se os programas cooperarem. Execute kill -- -42onde 42 é o pid do processo pai. Isso envia um sinal para todos os processos no grupo de processos liderados pelo processo 42 (o sinal de menos antes do pid significa grupo de processos).
Normalmente, se você executar seu script python a partir de um prompt de shell e ele simplesmente se bifurcar gnuchess, os dois processos deverão permanecer no mesmo grupo de processos. Mas esse não parece ser o caso, pois o Ctrl+ Cenvia SIGINTpara todo o grupo de processos em primeiro plano.
O Gnuchess pode estar em seu próprio grupo de processos porque se tornou um líder de sessão (mas não sei por que isso faria isso) ou porque você o bifurcou duas vezes (o python bifurca um shell que bifurca o gnuchess). Um garfo duplo provavelmente é evitável, mas não posso dizer isso sem ver seu código.
Uma maneira razoavelmente confiável e compatível com POSIX de encontrar o pid do gnuchessprocesso é
gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')
Variantes unix específicas podem ter melhores maneiras de conseguir isso, como pgrep.
pkillpara matar um processo pelo nome, para que o seups aux | grep gnuchessekill -9 PIDpode apenas tornarpkill -9 gnuchess