How to Properly Configure a Cron Job for Recursive chmod/chown Operations on Dropbox Directory


3 views

When you run commands manually in your shell, they benefit from your user environment including variables like $USER. However, cron jobs operate in a minimal environment where most shell variables aren't automatically available. This explains why your cron job fails while manual execution works.

Here's the correct way to implement this in cron:

10 * * * * /bin/chown -R $(whoami) /home/$(whoami)/Dropbox
10 * * * * /bin/chmod -R u+rw /home/$(whoami)/Dropbox

Key improvements:

  • Using absolute paths to binaries (/bin/chown instead of just chown)
  • Using $(whoami) instead of $USER for reliable username detection
  • Using full path to home directory instead of ~ expansion

For more complex operations, create a shell script:

#!/bin/bash
USER_HOME=$(getent passwd $(whoami) | cut -d: -f6)
chown -R $(whoami) "${USER_HOME}/Dropbox"
chmod -R u+rw "${USER_HOME}/Dropbox"

Then call it from cron:

10 * * * * /path/to/your/script.sh

If it still doesn't work:

  1. Check cron logs: grep CRON /var/log/syslog
  2. Redirect output to debug: 10 * * * * /path/to/command > /tmp/cron.log 2>&1
  3. Test environment: * * * * * env > /tmp/cron.env

When setting recursive permissions via cron:

  • Avoid running as root unless absolutely necessary
  • Consider using more restrictive permissions than u+rw
  • Audit the directory structure regularly
  • Monitor for permission changes outside the cron job

When running commands via cron, the environment is much more limited than your interactive shell. Most importantly, the $USER variable you're using won't be available in the cron context. Let's examine why your current approach fails:

10 * * * * sudo chown -R $USER ~/Dropbox

This fails because:
1. $USER isn't set in cron's environment
2. ~ expansion might not work as expected
3. sudo might require a tty or have different PATH settings

Here are several working approaches, each with different trade-offs:

Option 1: Use absolute paths and explicit username

10 * * * * sudo chown -R yourusername /home/yourusername/Dropbox && sudo chmod -R u+rw /home/yourusername/Dropbox

Option 2: Create a wrapper script

#!/bin/bash
export USER=yourusername
sudo chown -R "$USER" "/home/$USER/Dropbox"
sudo chmod -R u+rw "/home/$USER/Dropbox"

Then in cron:

10 * * * * /path/to/your/script.sh

Running recursive ownership changes via cron requires careful consideration:

  • Use specific paths (never use ~ in cron)
  • Consider using setfacl instead for more granular control
  • Log the operations for auditing

A more robust version with logging:

10 * * * * /path/to/script.sh >> /var/log/dropbox_perms.log 2>&1

Script contents:

#!/bin/bash
LOG="/var/log/dropbox_perms.log"
echo "Starting permission fix at $(date)" >> "$LOG"
{
  sudo chown -R yourusername /home/yourusername/Dropbox
  sudo chmod -R u+rw /home/yourusername/Dropbox
} >> "$LOG" 2>&1

For modern Linux systems, consider systemd timers instead of cron:

[Unit]
Description=Dropbox permission fix

[Service]
Type=oneshot
ExecStart=/usr/bin/chown -R yourusername /home/yourusername/Dropbox
ExecStart=/usr/bin/chmod -R u+rw /home/yourusername/Dropbox

Timer unit:

[Unit]
Description=Run dropbox permission fix hourly

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target