Quando você digita Ctrl + c , isso normalmente envia ao processo um sinal "INT". De signal(7) :
Signal Value Action Comment ────────────────────────────────────────────────────────────────────── ... SIGINT 2 Term Interrupt from keyboard
É comum que processos instalem um manipulador para este sinal, permitindo que eles executem alguma limpeza antes de sair. No caso do seu script led.py , parece que esse manipulador desligou os LEDs.
Por padrão, pkill e kill enviam o sinal "TERM" (15). (Você também tentou enviar "KILL" (9).) Esses sinais fizeram com que led.py morresse com menos graça, sem ter a chance de executar sua função de finalização.
Para permitir que led.py seja concluído corretamente, envie o sinal "INT" (2), com
pkill -2 [process specifier]
O comando pkill no seu crontab também pode não ter encontrado o processo, porque o nome que você deu não era o que estava procurando. De pkill(1) :
-f, --full
The pattern is normally only matched against the process name. When -f is set, the full command line is used.
Como seu script, led.py , era presumivelmente um script python, o nome do processo era simplesmente python (ou python3 ou similar). A linha de comando completa seria algo como python led.py , então as opções -f permitem que você combine isso.
pkill -2 -f led.py