#!/usr/bin/env bash dir="$( cd "$( dirname "$0" )" && pwd )" touch $dir/lockfile if [ -z "$1" ] || [ -z "$2" ]; then echo "invalid args" exit fi lang=$1 epoch=$(date +%s%N) basepath="/var/lib/lxc/piston/rootfs" filepath="/tmp/$epoch/code.code" argpath="/tmp/$epoch/args.args" stdinpath="/tmp/$epoch/stdin.stdin" arg=$(basename $argpath) # write arg file mkdir -p $basepath/tmp/$epoch chmod 777 $basepath/tmp/$epoch cat $2 > $basepath$filepath cat $3 > $basepath$argpath echo "${@:4}" > $basepath$argpath # process incrementor exec 200>$dir/lockfile flock -x 200 oldinc=$(cat $dir/i | awk '{$1=$1};1') newinc=$(expr $oldinc + 1) if (( newinc >= 151 )); then newinc=1 echo 1 > $dir/i else echo $newinc > $dir/i fi exec 200>&- # runner timeout -s KILL 20 \ lxc-attach --clear-env -n piston -- \ /bin/bash -l -c "bash /exec/$lang $newinc $epoch" # process janitor lxc-attach --clear-env -n piston -- \ /bin/bash -l -c "\ for i in {1..100}; do pkill -u runner$newinc --signal SIGKILL; done ;\ find /tmp -user runner$newinc -exec /bin/rm -rf {} \; ;\ find /var/tmp -user runner$newinc -exec /bin/rm -rf {} \; ;\ find /var/lock -user runner$newinc -exec /bin/rm -rf {} \; ;\ find /dev/shm -user runner$newinc -exec /bin/rm -rf {} \; ;\ find /run/lock -user runner$newinc -exec /bin/rm -rf {} \; ;\ " > /dev/null 2>&1 & rm -rf $basepath/tmp/$epoch