Tal vez haya varias formas posibles de lograrlo.
Primera solución (la más fácil): ¿Cómo sustituir las utilidades de Mac OS X por las del núcleo de GNU?
Siga lo anterior e instale gnu tail. A continuación, puede posiblemente tener una función o alias de tail a gtail. como
alias tail=gtail
o incluso una función Bash:
tail(){
command gtail "$@"
}
o simplemente llamar a gtail
en lugar de BSD tail
Segunda solución : La segunda forma de hacerlo sería hacer tu propia función, que puedes añadir en tu bash_profile o hacer un script, lo que te convenga. En este script, todo lo que estamos haciendo es comprobar si el PID existe o no. Si existe entonces hacemos cola, de lo contrario salimos con el código de retorno 1.
_tail(){
# usage _tail -f <file> <pid>
function _tail::trap() {
trap - SIGTERM && kill -- -$$
}
local FILE="$1"
local PID="$2"
if ps -p "$PID" > /dev/null; then
trap _tail::trap SIGINT
command tail -f "${FILE}" &
local pid=$!
disown # Optional: if you want to supress the kill SIGINT message
local run=true
while ${run}; do
if ! $(ps -p ${PID} > /dev/null); then
kill -9 ${pid} > /dev/null 2>&1
run=false
fi
done
else
return 1
fi
}
Ahora, puedes llamar a esta función como _tail <file-to-tail> <pid>
que hará exactamente lo mismo que gtail -f <file-to-tail> --pid=<pid>
Sin embargo, si quieres, puedes extenderlo más y hacer que tenga el mismo sintaxis que gnu tail añadiendo otra función llamada tail
y lo que es en .bash_profile o en su ruta como ejecutable.
tail(){
# usage: tail -f <file> --pid=<pid>
local fFlag="$1"
local FILE="$2"
local PIDARGS="$3"
local PIDARG="$(echo ${PIDARGS} | cut -d '=' -f1)"
local PID="$(echo ${PIDARGS} | cut -d '=' -f2)"
if [[ "$fFlag" == "-f" ]] && [[ -f "${FILE}" ]] && \
[[ "${PIDARG}" == "--pid" ]] && [[ $(ps -p "${PID}") ]]; then
_tail "${FILE}" "${PID}"
else
command tail "$@"
fi
}
[[ "${BASH_SOURCE[0]}" == "$0" ]] && tail "$@"