Ever write a script that ends before the things in it should?
The symptom is a file that gets partially written or partially copied. Sometimes the output files are zero-length. One example is the batch-mode sftp I wrote about last post.
Here's an illustrative example, followed by a trick to solve it.
In the empty-sftp program, empty spawns an sftp session, which runs in parallel, waiting for me (really empty, but it thinks it's me) to type ftp commands. If I only want to run one command
sftp> get filename
I can exit my script after issuing the command, but the pty will still be running. I can kill the pty before I exit the script, but if the file transfer hasn't finished, the kill will truncate the output.
The basic problem is that there is no process that I can watch that terminates after the file transfer ends; like any shell (which is really what it is), sftp just keeps running, waiting for the next command.
When the transfer's over, sftp closes the output file. We can watch to see when that happens, like this:
sleep 1/sbin/fuser $localfile || break
As soon as it finishes, we kill the sftp session, and exit.