script does not write to file when executed from cron

15,704
  1. To get the log file where you expect it to be, replace:

    LOG_FILE="test-crontab.log"
    

    With:

    LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
    
  2. The command [[ ${?} != 0 ]] is bash-only. From the error message that you quote, the script appears to be running under /bin/sh. One way to fix that is to replace:

    if [[ ${?} != 0 ]]; then
    

    With:

    if [ ${?} != 0 ]; then
    

    Another approach is to run crontab -e and add the following line to your crontab file:

    SHELL=/bin/bash
    
  3. Also, for simplicity and style, consider replacing:

    echo `date` >> ${LOG_FILE}
    

    with:

    date >> "${LOG_FILE}"
    

    This eliminates a useless use of echo.

  4. Lastly, consider putting double-quotes around all shell variables, particularly $LOG_FILE. Because the current value of LOG_FILE contains no spaces or shell-active characters, this is not needed now. But, putting double-quotes around them will will prevent unpleasant surprises in the future.

Share:
15,704

Related videos on Youtube

Sam
Author by

Sam

Updated on September 18, 2022

Comments

  • Sam
    Sam over 1 year

    When I run a /bin/bash script, it works fine and it logs into some log files inside the script. But, when I run it from cron, it does not log to the file! it only logs to /var/mail/root , saying that

    Date: Fri, 12 Aug 2016 08:39:01 +0300 (MSK)
    
    /bin/sh: 1: root: not found
    

    this is the script:

    #!/bin/bash
    
    LOG_FILE="test-crontab.log"
    echo "started testing cron" >> ${LOG_FILE}
    
    pgrep tunnel
    if [[ ${?} != 0 ]]; then
      echo "Tunnel process is not running..." | tee -a ${LOG_FILE}
      echo "initializing tunnel..." | tee -a ${LOG_FILE}
      /usr/local/bin/stunnel | tee -a ${LOG_FILE} 2>&1
    fi
    
    echo `date` >> ${LOG_FILE}
    

    and this is the cron:

    45 8 * * *  /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh > /dev/null
    
    • John1024
      John1024 over 7 years
      Two issues: (1) the script is running under sh but is using bash features, and (2) LOG_FILE should specify a complete path. (Neither of these issues, though, explains the error message.)
    • Alex Lowe
      Alex Lowe over 7 years
      Did you do chmod u+x /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-cront‌​ab.sh?
    • Sam
      Sam over 7 years
      @Alex - yes it has x permission for all.
    • Sam
      Sam over 7 years
      @john- it creates the file in the same folder script runs. So, that is not the issue. Script runs as expected when executed manually. about the sh, I think cron uses sh instead of bash. I don't know how to make it compatible
    • John1024
      John1024 over 7 years
      "it creates the file in the same folder script runs" According to the question, it wasn't writing to the file. Are you saying that the cron job does succeed in creating a file but fails to write to it?
    • Sam
      Sam over 7 years
      no, I say if I run the script manually, it creates and writes to the file itself.
    • John1024
      John1024 over 7 years
      Please look in your home directory and see if a file named test-crontab.log exists there also.
    • Sam
      Sam over 7 years
      yes! it has generated all the log files and script output zip files in the root directory! to solve the problem should I convert all absolute paths in the scripts to full path and then I think it will be fine. right?
  • FKEinternet
    FKEinternet over 4 years
    The user field is only present in crontab files saved in /etc/cron.d. In user-specific crontab files, the user field isn't present: The file's owner is the user.