Quando lanci un programma, diciamo ./pippo il task sarà sempre figlio della shell da cui e partito, e ciò indipendentemente dal fatto che sia in background o no.
Lo puoi notare con il comando ps, qualuque task ha un parent ID, che spesso corrisponde a quello della shell dalla quale è partito. Quindi se fai il kill della shell, farai altrettanto con tutti i suoi "figli".
Il comando nohup serve a dire ad un task di prendersi come task padre il task init, quello con ID 1, un task molto speciale, che non ha parent.
In questo modo se la shell viene killata lui può continare ad esistere.