I kinda figured it was an 'attached terminal' problem.

At your suggestion, I just ran it again with a serial terminal attached - here's the result:

sync neXus's music...
Restored terminal settings
Remounting first music partition read-only
Remounting second music partition read-only
Adding Swap: 16596k swap-space (priority -31)
Abnormal player termination
Player received SIGINT, user interruption
Switching to shell-player loop
Starting bash.
Adding Swap: 16028k swap-space (priority -32)
empeg:/empeg/bin# EXT2-fs warning: maximal mount count reached, running e2fsck i
s recommended
EXT2-fs warning: maximal mount count reached, running e2fsck is recommended

*********************

Shell exit
Starting player
Timezone: Europe/London
Hijack: intercepting config.ini

player.cpp : 385:empeg-car 2.00 2003/04/01.
Prolux 4 empeg car - 2.1434 Mar 26 2003
Vcb: 0x4086d000

The first line is my script echoing that text and the fsck warning is hardly surprising after all the mounting and unmounting I've been doing, but I don't expect that to make any difference. Apart from that, there's no real obvious errors. ******** is where the script runs and rsync hangs so I have to kill it.

I did run the whole thing with files missing on the empeg and rsync seemed quite happy to actually perform the transfers, but then stopped at the end and never exited.

Since it doesn't appear to a problem with output, this would suggest that rsync has a problem with stdin pointing to /dev/null. Is there any way to circumvent that? Or any other solutions spring to mind?