空间不足时暂停/暂停进程?

时间:2021-03-12 08:08:49

标签: linux bash

我想知道是否可以在磁盘空间不足时挂起/暂停 Bash 中的进程。例如,如果我正在工作的服务器上的可用磁盘空间低于 100 Gb 以暂停它而不是在达到 0 可用磁盘空间时使其崩溃。

我找不到任何与我类似的问题,但如果有请链接。我对信息学很陌生,因为我最近开始撰写基因组学论文,所以我什至不确定这是否可行。

干杯

大卫

2 个答案:

答案 0 :(得分:0)

当然,为什么不 - 您可以“暂停”Linux 中的任何进程。在伪代码中,即使有一些状态变量:

#!/bin/bash

bash some_bash_process &
pid=$!
trap 'kill "$pid"' EXIT

paused=false
while process_still_running "$pid"; do
   if free_disc_space_below 100G; then
       if ! "$paused"; then
          paused=true
          kill -s SIGSTOP "$pid"
       fi
   else
       if "$paused"; then
          paused=false
          kill -s SIGCONT "$pid"
       fi
   fi
   sleep 1
done

研究 shell 中的后台运行进程、信号以及 SIGSTOPSIGCONT 信号及其行为以获取更多信息。

答案 1 :(得分:0)

使用 df 定期检查磁盘使用情况。如果发现空间不足,请通过发送信号暂停进程。

processThatMightRunOutOfDiskSpace &
pid=$!
while
  [ -d "/proc/$pid" ] &&
  [ "$(df --output=avail / | tail -n1)" -gt 1048576 ]
do
  sleep 5
done
kill -TSTP "$pid"

确保为 df 指定正确的文件系统。我在这里使用了 /。但是,当您的进程将数据写入另一个文件系统(例如安装在 /home 上的单独文件系统)时,您必须改为指定该文件系统。

df 报告 1KB 块中的可用空间。 1048576 是 1024*1024,即填充一个 1GB 所需的 1KB 块数。

这里我们使用了信号 SIGTSTP,因为我假设您的进程是一个 bash 脚本。 SIGSTP 是当您点击 ctrlz 时发送到前台进程的信号 bash。然而,这个信号可以被忽略。如果它不起作用,请改用 SIGSTOP (kill -STOP)。 在这两种情况下,要继续停止的进程,请使用 kill -CONT "$pid"