【发布时间】:2020-11-05 19:02:06
【问题描述】:
我有一个小脚本可以在限制 CPU 时间的 cgroup 中运行命令:
$ cat cgrun.sh
#!/bin/bash
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <bin>"
exit 1
fi
sudo cgcreate -g cpu:/cpulimit
sudo cgset -r cpu.cfs_period_us=1000000 cpulimit
sudo cgset -r cpu.cfs_quota_us=100000 cpulimit
sudo cgexec -g cpu:cpulimit sudo -u $USER "$@"
sudo cgdelete cpu:/cpulimit
我让命令运行:./cgrun.sh /bin/sleep 10
然后我从另一个终端向睡眠命令发送 SIGSTOP。不知何故,此时父命令sudo 和cgexec 也收到了这个信号。然后,我将 SIGCONT 发送到 sleep 命令,它允许 sleep 继续。
但是此时sudo 和cgexec 都被停止了,永远不会收获休眠进程的僵尸。我不明白这怎么会发生?我该如何预防呢?此外,我无法将 SIGCONT 发送到 sudo 和 cgexec,因为我正在从用户发送信号,而这些命令以 root 身份运行。
这是它在 htop 中的样子(省略了一些列):
PID USER S CPU% MEM% TIME+ Command
1222869 user S 0.0 0.0 0:00.00 │ │ └─ /bin/bash ./cgrun.sh /bin/sleep 10
1222882 root T 0.0 0.0 0:00.00 │ │ └─ sudo cgexec -g cpu:cpulimit sudo -u user /bin/sleep 10
1222884 root T 0.0 0.0 0:00.00 │ │ └─ sudo -u desertfox /bin/sleep 10
1222887 user Z 0.0 0.0 0:00.00 │ │ └─ /bin/sleep 10
如何以不将 SIGSTOP 退回到父进程的方式创建 cgroup?
更新
如果我使用 systemd-run 启动进程,我不会观察到相同的行为:
sudo systemd-run --uid=$USER -t -p CPUQuota=10% sleep 10
【问题讨论】:
标签: linux bash signals sudo cgroups