我需要连夜“重新同步”Android 源,因为我每月的带宽有限。
,我在午夜启动“回购同步”,然后想在早上 8 点终止它。以下是命令:
2 0 * * * /home/user/android-src/reposync.sh
reposync.sh 包含:
cd /home/user/android-src
/home/user/bin/repo sync
我希望用以下 cron 条目来杀死它:
55 7 * * * ps -eo pid,args | grep repo | awk '{print $1}' | xargs -I {} kill {}
0 8 * * * ps -eo pid,args | grep repo | awk '{print $1}' | xargs -I {} kill -9 {}
问题是“reposync”产生了许多进程——大量的“git”、“curl”、“git-remote-http”、“python”(我认为是“bash”和“sh”,因为我将 repo 同步命令放入 .sh 脚本中)。 (为我的无知/术语道歉。)
我怎样才能找到杀死它们的进程?或者,还有更好的方法?存储库会以普通用户身份运行吗?我可以终止该用户的所有任务吗?我想让我的计算机在无人看管的情况下运行几天,并让它每天晚上连接并每天早上断开连接,尽管感激地考虑了任何解决方案,包括丑陋的,例如,我应该终止互联网连接,以便回购超时恢复吗?服务器上没有其他任何东西在运行(Win7 x64 上的 VirtualBox,运行 Ubuntu 10.04),所以我应该每早上 8 点重新启动一次吗?
答案1
使用否定参数来kill
终止整个进程组。
#!/bin/sh
ps -eo pid,args |
awk '/[r]epo/{print $1}' |
xargs -I {} kill "$@" -{}
另请注意有关如何避免的古老常见问题解答无用 grep | grep -v grep | awk
。
像这样调用这个
55 7 * * * /path/to/killsync
0 8 * * * /path/to/killsync -9
我们希望第二个永远不会被真正需要;希望如此无用也。
看https://stackoverflow.com/questions/11000538/linux-kill-with-negative-pid
答案2
您需要杀死的进程已经产生了也需要被杀死的子进程:
vi killemall.sh
---------------
#!/bin/bash
#
# Get the process PID
# Kill all the processes that have a parent pid = PID
# Kill the master process
#
MASTERPID=`ps -eo pid,args | grep repo | awk '{print $1}'`
ps -ef | grep ${MASTERPID} | awk '{print $1}'` | while read PIDX; do kill -9 ${PIDX} 2>/dev/null; done;
存储库会以普通用户身份运行吗?我可以终止该用户的所有任务吗?
# Should work, but it's a complete overkill
我应该终止互联网连接,以便存储库超时然后恢复它吗?那么我应该每早上 8 点重新启动一次吗?
# No need to come up with "excentric" solutions. Follow the Kill-Em-ALL approach, and that should solve your issue.