Cifs keepalive


This post originally talked about, which is now bundled into the newer and more fully-featured


When a Linux system has a cifs mount to another server, sometimes it can time out. If you haven’t used it in a while, the connection becomes stale. If you do an ls -l /mnt it might take a while, and then return a ‘/mnt/cifsdirectory not found’ before displaying the directory contents.


My solution is a multi-tool script for network shares, which I simply call “shares.” It’s a part of my bgscripts package accessible on github.

Code walkthrough

Obviously, there are many ways to implement this. All my script does is touch a file in a cifs mounted directory every couple of minutes.

Check out its usage block from lines 18-33.

usage: [-duV] [-r|-k] [-a] [-t <type>] [/mounted/directory [ ... ]]
version ${sharesversion}
-d debug Show debugging info, including parsed variables.
-u usage Show this usage block.
-V version Show script version number.
-r remount Remount shares
-k keepalive Touch shares to keep them from timing out
-a all All shares. Can be limited with -t. Default behavior if no directories provided.
-t <type> Only this type of share. Needs -a flag.
Return values:
0 Normal
1 Help or version info displayed
2 Invalid input options
3 Incorrect OS type
4 Unable to find dependency
5 Not run as root or sudo

The best way to run it is just with the -a flag. It will scan the currently mounted filesystems and list just the cifs/nfs ones as defined $validtypes. See lines 224-237,245:

# all currently mounted filesystems of the requested type
# get type, if requested
alltypes="$( echo "${validtypes}" | tr ' ' '|' )"
case "${type}" in
      if echo "${validtypes}" | grep -qiE "${type}" 1>/dev/null 2>&1;

mount | grep -viE "${excludes}" | awk "/type ${searchstring}/{print \$3;}" >> "${tempfile1}"

And the actual keepalive command is just a touch –no-create, from lines 268-276.

   while read word;
       debuglev 1 && echo "touching ${word}";
       touch --no-create "${word}/.fskeepalive" 1>/dev/null 2>&1
   done < "${tempfile1}"

To make it run every three minutes, place a cron entry. Mine is in /etc/cron.d/shares-keepalive.cron:

*/3	*	*	*	*	root	/usr/share/bgscripts/ --all --keepalive 1>/dev/null 2>&1