Terminal command to quit Google's "Backup and Sync"?

Is there a terminal command I can use to quit Google's "Backup and Sync" software? I am writing a Bash script to set the machine up for maximum battery life and I would like to shutdown all non-essential software that I usually have running in the background such as Backup and Sync. I tried the usual suspects (osascript -e 'tell app "Backup and Sync from Google" to quit' AND killall 'Backup and Sync from Google') without success.


Solution 1:

Weird, just tried killall "Backup and Sync from Google" and it failed.

Try killall Backup\ and\ Sync, that worked for me for some reason. Adding \ from seems to break things.

Solution 2:

This post is old, but I struggled with it, so I thought I'd help. The reason the "\ from\ Google" doesn't work is because that is not what the process is, there is no "from Google in the process name. If you do:

ps -ef | grep "Backup\ and\ Sync"

You will get output like this:

501 37327 1 0 3:37PM ?? 0:06.37 /Applications/Backup and Sync.app/Contents/MacOS/Backup and Sync

It shows that the process name has no "from Google" in it. In fact, if you look in the applications directory with finder and do a "get info" it will show you the real application name. "Backup and Sync from Google" is just branding. I've seen this with other apps as well. This is ALSO what osascript also knows it as, so you can do:

osascript -e 'tell application "Backup and Sync" to activate'

and

osascript -e 'quit app "Backup and Sync"'

Which is more graceful than kill.

Note that if you have multiple users configured in Backup and Sync, you'll have to figure out the PID of the correct user, and then kill it. That's more complicated. I have a script to do that, but I don't have multiple users anymore, so not sure it still works, but for what it's worth it's below. Also don't know what the results of the osascript call is when there are multiple users.

function GoogleBackup {

if there are no parameters the error out

if [ $# -lt 1 ] then echo "$(date): Bad call of function GoogleDrive" echo "$(date): Usage:" echo "$(date): GoogleDrive [start]"
echo "$(date): GoogleDrive [killall]"
echo "$(date): GoogleDrive [stop username]"
return 0 fi

googlefound=false

case $1 in

start)

#starts Backup and Sync for all users
echo "$(date): Starting Google Backup and Sync"
open /Applications/Backup\ and\ Sync.app

;;

stop)

#stops Backup and Sync for a specified user

# if there is no username (paramenter 2) specified, exit
if [ $# -ne 2 ]
then
    echo "$(date): Incorrect parameters.  Need Google username"
    return 0
else
    #loop through each Backup and Sync user directory and look for the user to get to the PID of that process
    for path in $HOME/Library/Application\ Support/Google/Drive/user_*
    do
        # if not a directory, skip
        [ -d "${path}" ] || continue 
        dirname="$(basename "${path}")"
        #the sync_log.log file has the user name in it.  If the username is in this log file then the PID file has the process to kill
        user=$(cat $HOME/Library/Application\ Support/Google/Drive/$dirname/sync_log.log | grep "Request (" | tail -1 | awk '{print $2}' | sed 's/[)(:]//g')
        # check to see if the user in the log file matches the user specified           
        if [ "$user" == "$2" ]
        then
            #If the user matches, get the PID to kill
            pidtokill=$(cat $HOME/Library/Application\ Support/Google/Drive/$dirname/pid)
            # make sure the PID is running AND it's a Backup and Sync process (reduces risk of recycled PID)
            if ps -p $pidtokill | grep "Backup\ and\ Sync" > /dev/null
            then
                echo "$(date): Stopping backup and Sync for user $user"
                kill -quit $pidtokill
            else
                echo "$(date): Google Backup and Sync user $user is not running"
            fi
            googlefound=true
        fi
    done

    # if the specified user is not found, then log an error and provide a list of known users
    if ! $googlefound
    then
        echo "$(date): User $2 not found.  Users include:"
        for path in $HOME/Library/Application\ Support/Google/Drive/user_*
        do
            [ -d "${path}" ] || continue # if not a directory, skip
            dirname="$(basename "${path}")"
            echo "$(date): $(cat $HOME/Library/Application\ Support/Google/Drive/$dirname/sync_log.log | grep "Request (" | tail -1 | awk '{print $2}' | sed 's/[)(:]//g')"
        done
    fi
fi

;;

killall)

echo "$(date): Stopping Google Backup and Sync ALL users"
# LOG the users that are running and not running
for path in $HOME/Library/Application\ Support/Google/Drive/user_*
do
    [ -d "${path}" ] || continue # if not a directory, skip
    dirname="$(basename "${path}")"
    user=$(cat $HOME/Library/Application\ Support/Google/Drive/$dirname/sync_log.log | grep "Request (" | tail -1 | awk '{print $2}' | sed 's/[)(:]//g')
    if [ "$user" != "" ]
    then
        pidtokill=$(cat $HOME/Library/Application\ Support/Google/Drive/$dirname/pid)
        if ps -p $pidtokill |  grep "Backup\ and\ Sync"> /dev/null
        then
            echo "$(date): Stopping backup and Sync for user $user"
            googlefound=true

        else
            echo "$(date): Google Backup and Sync user $user is not running"
        fi
    fi
done
# Actually stop all users if we found any that are running, otherwise just say they are all stopped
if $googlefound
then
    killall Backup\ and\ Sync > /dev/null 
else
    echo "$(date): No Google Backup and Sync Processes were running"
fi

;;

*)

echo "$(date): Bad call of function GoogleDrive"
echo "$(date):  Usage:"
echo "$(date):  GoogleDrive [start]"    
echo "$(date):  GoogleDrive [stopall]"  
echo "$(date):  GoogleDrive [stop username]"    
return 0

;;

esac

}

(The $(date) in the echo is because this runs in the background at startup based on wifi connections and the output goes to a log file.)

Apologies if I'm not answering the "right way" as this is my first post.