kill -9 ( SIGKILL ) is really a last ditch attempt
you should try -2 ( SIGINT ) first ( that is what Ctrl+C sends )
if that fails -15 ( SIGTERM ), that asks the process to terminate
as @volkerdi points out, it is could be a zombie
https://en.wikipedia.org/wiki/Zombie_process
to figure out if it is a zombie, check ( top ) the status column is usually to the left of CPU% , look for Z ( PgDown/PgUp or Down/Up arrow )
As they are undead you cannot kill them, typically they are only around for a short time and are perfectly normal.
However, if you find a particular program/script often spawns "long lived" Zombies you should investigate and possibly discontinue use of it in favour of an earlier/later version that does not exhibit such bad behaviour.
for the most part they are harmless, as the zombie is not really doing anything ( although they may be hold onto resources )
some more details on signals ( man 7 signal )
SIGHUP ( -1 ) is worth a mention, you can use that to restart a process
I must admit, I don't think I've used that in quite a while a daemon is best restarted via init script/service
I have found some Python code to behave oddly ( notably git )
where I have had to send SIGINT ( -2 ) SIGTSTP ( -20 ) SIGCONT ( -18 ) for it to exit cleanly but I've not needed that in a long time.
Edit
Regards "copy operations" is this cp ?
If so I would investigate the health of the hard drive.