| #!/bin/bash |
| # ----------------------------------------------------------------------------- |
| # Launches Buck daemon if not already running and requests Buck task execution. |
| # ----------------------------------------------------------------------------- |
| |
| BUCK_DAEMON=$1 |
| TASK=${2:-unspecified} |
| DATA=${3} |
| |
| # TODO: Figure out how to parametrize better |
| BUCK_PROPS="-Dcheckstyle.config=$4 -Dcheckstyle.suppressions=$5" |
| |
| PORT_FILE="$1.port" |
| |
| function ppid() { |
| ps -p ${1:-$$} -o ppid= -o pid= -o comm= |
| } |
| |
| function buck_pid() { |
| BUCK_PID=($(ppid)) |
| while [ ${BUCK_PID[0]} -ne 0 ]; do |
| BUCK_PID=($(ppid $BUCK_PID)) |
| if [ "${BUCK_PID[2]}" == "buck" ]; then |
| # use parent PID of buck |
| echo ${BUCK_PID[0]} |
| return |
| fi |
| if [ "${BUCK_PID[2]}" == "buckd" ] || |
| [[ "${BUCK_PID[2]}" == *"python"* ]]; then |
| # use PID of buckd or python |
| echo ${BUCK_PID[1]} |
| return |
| fi |
| done |
| # fallback last read PID |
| echo ${BUCK_PID[1]} |
| } |
| |
| function port() { |
| cat $PORT_FILE 2>/dev/null || echo 0 |
| } |
| |
| function check_socket() { |
| nc localhost $(port) < /dev/null 2>/dev/null |
| return $? |
| } |
| |
| # check to see if buck daemon is running; if not, start it |
| if ! check_socket; then |
| # Starting buck daemon... |
| #FIXME change to /dev/null if/when we are confident |
| nohup java $BUCK_PROPS -jar $BUCK_DAEMON $PORT_FILE $(buck_pid) >>/tmp/buck.daemon 2>&1 & |
| |
| TRIES=20 |
| i=0 |
| # Wait for buck daemon to start for 2 seconds |
| while [ $i -lt $TRIES ]; do |
| if check_socket; then |
| CONNECTED=true |
| break |
| fi |
| let i=i+1 |
| sleep 0.1 |
| done |
| if [ -z "$CONNECTED" ]; then |
| echo "Failed to start buck daemon" |
| exit 3 |
| fi |
| fi |
| |
| # run the actual buck daemon client |
| OUT=$((printf "%s\n" $TASK; cat $DATA) | nc localhost $(port)) |
| if [ $? -ne 0 ]; then |
| echo "Error connecting to buck daemon server" |
| exit 2 |
| fi |
| if [ -n "$OUT" ]; then |
| printf "$OUT" |
| exit 1 |
| fi |