2022-04-18 11:21:20 +08:00

113 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
##################################################
# Mount dir #
# - /opt/datax/log #
# - /opt/datax/log_perf #
# - /opt/datax/job #
# ENV #
# - JAVA_OPTS #
# - TIMEOUT #
# - MAX_PROCS #
##################################################
set -euo pipefail
export LANG=en_US.UTF-8
trap Quit EXIT
GOT_SIGTERM=
TIMEOUT="${TIMEOUT:-10m}"
MAX_PROCS=${MAX_PROCS:-1}
function Print {
local file=/dev/null
[ '-f' = "$1" ] && file=$2 && shift && shift
date +"[%F %T] $*" | tee -a $file
}
function Quit {
while :; do
pkill -f java && Print killing java ... || break
sleep 1
done
exec 1022<&-
Print Container stopped.
test -n "$GOT_SIGTERM"
}
function Usage {
Print 'This container should run with
**env TIMEOUT, default 10m(ten minutes)**
**env MAX_PROCS, default 1**
**/opt/datax/{log,log_perf,job} mounted from host**
'
}
function InitPipe {
Print Init named pipe ...
rm -rf pool.pipe
mkfifo pool.pipe
exec 1022<> pool.pipe
rm -rf pool.pipe
printf "%${MAX_PROCS}s" '' >&1022
}
function StartJob {
local job="$1"
local code=0
Print Start job $job with timeout $TIMEOUT ...
timeout ${TIMEOUT} java \
-server \
-Xms1g \
-Xmx1g \
-Duser.timezone=GMT+08 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=$PWD/log \
${JAVA_OPTS:-} \
-Dfile.encoding=UTF-8 \
-Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener \
-Djava.security.egd=file:///dev/urandom \
-Ddatax.home=$PWD \
-Dlogback.configurationFile=$PWD/conf/logback.xml \
-classpath "$PWD/lib/*:." \
-Dlog.file.name=$job \
com.alibaba.datax.core.Engine \
-mode standalone \
-jobid -1 \
-job $PWD/job/$job.json \
>/dev/null \
2>log/$job.error \
|| code=$?
if [ 0 -eq $code ]; then
Print Job $job finished.
elif [ 124 -eq $code ]; then
Print Job $job timeout!
else
Print Job $job stopped unexpectly!
fi
echo >&1022
}
function StartProc {
Print Start datax with max $MAX_PROCS parallel jobs ...
local job=
for job in $(ls job/ | grep '\.json$'); do
read -n 1 -u 1022
StartJob "${job%.json}" &
done
wait
[ -n "$job" ] || Print Not found any job!
}
function Main {
cd /opt/datax
Usage
InitPipe
trap "GOT_SIGTERM=1; Print Got SIGTERM ...; exit" SIGTERM
StartProc
}
# Start here
Main