#!/usr/bin/env bash _scriptname="ddv" set -u set -e function log { printf '%s\n' "$*" >&2; } # print usage function printusage { cat - >&2 < Options: See: $ ${_scriptname} --help EOF } if (($# == 0)); then printusage exit 0 fi # exit trap! function die { { ((pid != 0)) || return trap - CHLD EXIT set +e kill -TERM "$pid" wait "$pid" status=$? pid=0 exit $status } 2>/dev/null } #trap die CHLD trap 'echo -en "\nAborting..." >&2; die' EXIT # vars pcount=10 pid=0 # verbose output log "status every $pcount seconds" # dd options opts=( "oflag=sync" ) # add bs=1M if none is specified bs=false for opt; do if [[ "${opt,,}" = "bs="* ]]; then bs=true break fi done $bs || opts+=( "bs=1M" ) # run dd set +m log "dd ${opts[*]} $*" dd "${opts[@]}" "$@" & pid=$! log "pid: $pid" # print status every $pcount seconds c=0 while kill -0 "$pid" 2>/dev/null && sleep 1; do ((++c % pcount != 0 )) || kill -USR1 "$pid" 2>/dev/null || : done # explicitly sync drives log "sync" sync 2>/dev/null || : # exit die