As linhas de rc.local não são executadas em paralelo. Ele será executado na mesma ordem que qualquer outro script bash.
Não adivinhe por que P2 não foi executado, descubra com certeza registrando sua saída. Por exemplo:
P1 > /tmp/P1.startup 2>&1
P2 > /tmp/P2.startup 2>&1
Se P1 tiver que ser concluído com êxito antes que P2 seja executado, você precisará definir uma declaração if true. Um deles funcionará:
P1 && \
P2
Ou
P1
test $? -eq 0 && P2
Ou
P1
if [[ $? == 0 ]]
then
P2
fi