Primeiramente, conforme escrito, seu ping será executado para sempre, a menos que seja incapaz de encontrar o host, porque ele é executado até que ele capture um sinal (ou seja, SIGINT ) dizendo para parar.
Os scripts em /etc/rc.local não são, pelo que me lembro, executados em segundo plano. Como tal, o seu script nunca termina, pois é um loop infinito. Dependendo exatamente do motivo pelo qual você está fazendo isso, você pode contextualizá-lo ou alterá-lo para sair quando uma condição for atendida.
Se você está fazendo isso para atrasar até que uma rede apareça, você pode:
while ! ping -c1 10.9.0.1; do
sleep 1
done
Ou, se você realmente quiser que um ping de uma vez por segundo seja executado em segundo plano, você pode usar screen ou nohup ou disown para separar o processo do shell e permitir que a inicialização prossiga.
De qualquer maneira, isso é uma coisa potencialmente perigosa para fazer, já que você não tem nenhum meio de parar o script na inicialização se as coisas derem errado.
Você pode ser mais bem servido com um script em /etc/init.d/ , que está vinculado ao seu nível de execução escolhido que tem lógica suficiente para abortar se as coisas demorarem demais.