for p in psutil.process_iter():
try:
- if p.name != 'aptitude': continue
- parent = p.parent
+ if p.name() != 'aptitude': continue
+ parent = p.parent()
if parent is None: continue
- if parent.name != 'schroot': continue
+ if parent.name() != 'schroot': continue
#
try:
rootdir = os.readlink('/proc/%d/root'%(p.pid,))
if cputime < cutoff_time: continue
#
p.kill()
- except psutil.error.NoSuchProcess:
+ except psutil.NoSuchProcess:
pass
--- /dev/null
+#!/usr/bin/python
+
+# kills aptitude processes that eat an excessive amount of resources
+
+# Copyright 2013 Peter Palfrader
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import os
+import errno
+import sys
+try:
+ import psutil
+except OSError, e:
+ # XXX: This is a hack, but since we are run from cron, it's
+ # better to handle this on the next run than to send mail.
+ if e.errno == errno.ENOENT:
+ sys.exit(0)
+
+total_mem = psutil.phymem_usage().total
+cutoff_time = 60*10
+
+for p in psutil.process_iter():
+ try:
+ if p.name != 'aptitude': continue
+ parent = p.parent
+ if parent is None: continue
+ if parent.name != 'schroot': continue
+ #
+ try:
+ rootdir = os.readlink('/proc/%d/root'%(p.pid,))
+ except OSError as e:
+ if e.errno == errno.ENOENT:
+ continue
+ else:
+ raise e
+ if not rootdir.startswith('/var/lib/schroot/mount'): continue
+ #
+ used = p.get_memory_info().vms
+ if used < total_mem: continue
+ #
+ cputime = p.get_cpu_times().user
+ if cputime < cutoff_time: continue
+ #
+ p.kill()
+ except psutil.error.NoSuchProcess:
+ pass
package { 'python-psutil':
ensure => installed,
}
- file { '/usr/local/sbin/buildd-schroot-aptitude-kill':
- source => 'puppet:///modules/buildd/buildd-schroot-aptitude-kill',
- mode => '0555',
+ if ($::lsbmajdistrelease >= 8) {
+ file { '/usr/local/sbin/buildd-schroot-aptitude-kill':
+ source => 'puppet:///modules/buildd/buildd-schroot-aptitude-kill',
+ mode => '0555',
+ }
+ } else {
+ file { '/usr/local/sbin/buildd-schroot-aptitude-kill':
+ source => 'puppet:///modules/buildd/buildd-schroot-aptitude-kill.wheezy',
+ mode => '0555',
+ }
}
} else {
file { '/usr/local/sbin/buildd-schroot-aptitude-kill':