Quick Tip #6: Triggering Actions on File Close

Sometimes it’s useful to trigger an action after a file is closed. Suppose you started a lengthy download on your notebook and you want to suspend it as soon as the download is done. There are several ways to achieve this.

If you started the download using a web browser like Chrome, the file will be renamed as soon as it is done. You can run a simple shell loop that waits until the file doesn’t exist anymore:

# while [ -e file.part1.zip ]; do sleep 1; done; pm-suspend

When downloading using a command line tool like wget that doesn’t rename downloaded files, you can use the fuser Linux utility to check if the downloaded file is still open. If it isn’t, the download is done:

# while fuser -s file.zip; do sleep 1; done; pm-suspend

Things get more complicated if there are multiple files involved and you want a solution that both handles file closes and renames. This is what I have come up with:

# sleep-while-open.sh file1 file2 file3; pm-suspend

And here’s the sleep-while-open.sh script:

#! /bin/sh
STATUS=open
while [ $STATUS = open ]; do
    STATUS=closed
    for F in "$@"; do
	if [ -e "$F" ] && fuser -s "$F"; then
	    STATUS=open
	fi
    done
    sleep 1
done

Note that for the pm-suspend to work, you either have to run your commands in a root shell or use sudo. Since you won’t be there to enter the password, you’ll need to give your user permissions to run /usr/sbin/pm-suspend in /etc/sudoers.

Advertisements
This entry was posted in shell and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s