SOLVED IT! [Bash script, caffeinate - help]

Discussion in 'Mac Programming' started by dasx, Nov 12, 2012.

  1. dasx, Nov 12, 2012
    Last edited: Nov 21, 2012

    macrumors 65816

    dasx

    Joined:
    Jun 18, 2012
    Location:
    Barcelona
    #1
    Hey there.
    I sometimes leave my computer at night uploading files to an FTP server. It sometimes needs to upload just 300MB, sometimes 3GB.

    In Lion, I had no problems at all. I started uploading, turned screen off (Shift+Control+Eject that is) and went to sleep. The Mini would keep uploading till done, and then would go to sleep too.

    In Mountain Lion… well, can't really do that anymore. If I start uploading something and then turn the screen off, the Mini will go to sleep in a 1 minute to 5 minutes bracket, no matter what. (Sleep is set to 12 minutes, so weird… And I don't wanna disable it as I like it to go sleep when not in use).

    I then read about caffeinate, and tried estimating how long it'd take to upload all the files and ran:

    Code:
    $ caffeinate -t 7200
    That keeps my computer awake for 2 hours and then puts it to sleep. So pretty nice.

    I then decided to create a program which would monitor the upload speed and put the Mini to sleep as soon as it's done.

    Problem is it isn't working. I mean, the program works but it's like if no caffeinate process was executed. Can't figure out why.

    Any help?

    Here's the code:


    Code:
    coffee(){
            count=0
            while [ $count -lt 5 ]
                    do
                            a=`netstat -ibI en1 | awk '$3 ~ /Link/ {print $10}'`
                            sleep 5
                            b=`netstat -ibI en1 | awk '$3 ~ /Link/ {print $10}'`
                            in=$(((b-a)/1024/5))
                            if [ $in -gt 50 ]
                                    then    echo "Downloading at $in KB/s"
                                            echo "Waiting 5 minutes..."
                                            echo ""
                                            count=0
                                            caffeinate -t 300 
                                    else
                                            count=$((count+1))
                                            echo "Wait $count of 5... (1 minute)"
                                            echo ""
                                            caffeinate -t 60
                            fi
                    done
            echo ""
            echo "LET'S SLEEP"
            echo ""
    }
    
    Idea: See average upload speed in 5 seconds. If higher than 50KB/s, caffeinate the computer for 5 minutes. Check again. As soon as it's lower, it'll start a 5 minute wait devided in 5 to check if the speed drop was puntual.
    If upload speed is lower than 50KB/s for 5 minutes, then program quits and computer is free to go to sleep as soon as it wants to.

    As I said though, it isn't working. :(
     
  2. macrumors 603

    Joined:
    Aug 9, 2009
    #2
  3. thread starter macrumors 65816

    dasx

    Joined:
    Jun 18, 2012
    Location:
    Barcelona
    #3
    Thanks for the reply.
    That would make sense but when I run the command itself (caffeinate -t xxx) it seems to work like a charm. Always.

    That's why I can't get around with this. :confused:
     
  4. macrumors member

    Joined:
    Jun 17, 2012
    #4
    The caffeinate man page shows:
    Code:
    caffeinate [-disu] [-t timeout] [utility] [argument ...]
    ...
         If a utility is specified, caffeinate creates the assertions
         on the utility's behalf, and those assertions will persist for the dura-
         tion of the utility's execution. 
    ...
    If you can use a command line ftp client (ncftpput, for example. ncftp is in macports), you could try to run it via caffeinate.
     
  5. thread starter macrumors 65816

    dasx

    Joined:
    Jun 18, 2012
    Location:
    Barcelona
    #5
    Tried that, and worked, but any ideas why the program isn't working? It's driving me crazy! Need to know!
     
  6. macrumors member

    Joined:
    Jun 4, 2009
    #6
    Use sh -x (or bash -x if you are using bash) to give you some debugging output.
     
  7. thread starter macrumors 65816

    dasx

    Joined:
    Jun 18, 2012
    Location:
    Barcelona
    #7
    Can't run the app when previously ran $bash -x. :confused:
     
  8. macrumors member

    Joined:
    Jun 4, 2009
    #8
    And no one can help you if you aren't a bit more precise :p

    What did you type? What was the output?

    I'm assuming the $ in your comment is just a typo?
     
  9. thread starter macrumors 65816

    dasx

    Joined:
    Jun 18, 2012
    Location:
    Barcelona
    #9
    Found the problem!
    Looks like when system is ready to sleep, it doesn't as caffeinate is running. But as soon as it ends and the script should check again if run caffeinate again or not, the system puts itself to sleep.

    So I modified the code. In red.

    Code:
    coffee(){
    [COLOR="Red"][B]        caffeinate &[/B][/COLOR]
            count=0
            while [ $count -lt 5 ]
                    do
                            a=`netstat -ibI en1 | awk '$3 ~ /Link/ {print $10}'`
                            sleep 5
                            b=`netstat -ibI en1 | awk '$3 ~ /Link/ {print $10}'`
                            in=$(((b-a)/1024/5))
                            if [ $in -gt 50 ]
                                    then    echo "Downloading at $in KB/s"
                                            echo "Waiting 5 minutes..."
                                            echo ""
                                            count=0
    [COLOR="red"][B]                                        sleep 300 [/B][/COLOR] #caffeinate -t 300 before
                                    else
                                            count=$((count+1))
                                            echo "Wait $count of 5... (1 minute)"
                                            echo ""
    [COLOR="red"]                                        [B]sleep 60[/B][/COLOR] #caffeinate -t 60 before
                            fi
                    done
            echo ""
            echo "LET'S SLEEP"
            echo ""
    [COLOR="red"][B]        killall caffeinate[/B][/COLOR]
    }
    
    This way there's always a caffeinate process running and it's stopped when the program ends.

    Now working like a charm. :)
     

Share This Page