如果 python 脚本在 2 分钟内没有向终端输出任何内容,我想终止它

Ard*_*deh 4 shell bash python executable

这是我当前的 bash,它只是一个循环

while true ; do 
     python3 /Users/Name/Desktop/pythoncode.py
done
Run Code Online (Sandbox Code Playgroud)

pythoncode.py如果它在 2 分钟内没有向终端输出任何内容,我想终止

Sté*_*las 6

zsh

zmodload zsh/system
(
  echo $sysparam[pid]
  exec python3 /Users/Name/Desktop/pythoncode.py
) | {
  read pid
  if sysread -o 1 -s 1 -t120; then
    cat
  else
    kill -s PIPE $pid 2> /dev/null
  fi
}
Run Code Online (Sandbox Code Playgroud)

使用bash,您可以执行类似的操作:

(
  echo "$BASHPID"
  exec python3 /Users/Name/Desktop/pythoncode.py
) | {
  read pid
  if LC_ALL=C IFS= read -rd '' -n1 -t120 byte; then
    if [ -n "$byte" ]; then
      printf %s "$byte"
    else
      printf '\0'
    fi
    cat
  else
    kill -s PIPE "$pid" 2> /dev/null
  fi
}
Run Code Online (Sandbox Code Playgroud)

那些检查该脚本是否向标准输出写入任何内容,而不是专门写入终端。

如果您还想在命令写入内容时停止,但在两分钟内停止并且没有输出任何内容,或者换句话说,在 2 分钟不活动后终止命令,那么您可以使用socat

socat -T120 'exec:python3 /Users/Name/Desktop/pythoncode.py' -
Run Code Online (Sandbox Code Playgroud)

或与zsh

zmodload zsh/system
(
  echo $sysparam[pid]
  exec python3 /Users/Name/Desktop/pythoncode.py
) | {
  read pid
  while
    sysread -o 1 -t 120; ret=$?
    (( ret == 0 ))
  do continue; done
  # 5 means EOF
  (( ret == 5 )) || kill $pid
}
Run Code Online (Sandbox Code Playgroud)