4 votos

En Mac, ¿cómo hacer `tail -f --pid` para terminar después de la salida del proceso como Linux?

tail en el Linux actual tiene --pid para terminar después de cierto id de proceso, mientras que tail bajo MAC OSX no tiene la misma opción. Por ejemplo tail -f --pid=<process_pid> puede terminar el modo de cola si process_pid termina.

Entonces, ¿cómo podemos obtener el mismo resultado que Linux tail -f --pid ?

7voto

Rakib Fiha Puntos 11

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 "$@"

enter image description here

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X