blob: ddb1265535fb7037a001fefd193e3382100c01f3 [file] [log] [blame]
#! /usr/bin/python
# -*- python -*-
# -*- coding: utf-8 -*-
# Copyright (C) 2008 Red Hat Inc.
#
# Arnaldo Carvalho de Melo <acme@redhat.com>
#
# This application is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 2.
#
# This application is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
from __future__ import print_function
import os
import schedutils
import sys
def usage():
print('''pchrt (python-schedutils)
usage: pchrt [options] [prio] [pid | cmd [args...]]
manipulate real-time attributes of a process
-b, --batch set policy to SCHED_BATCH
-f, --fifo set policy to SCHED_FIFO
-i, --idle set policy to SCHED_IDLE
-p, --pid operate on existing given pid
-m, --max show min and max valid priorities
-o, --other set policy to SCHED_OTHER
-r, --rr set policy to SCHED_RR (default)
-R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR
-h, --help display this help
You must give a priority if changing policy.
Report bugs and send patches to <tuna-devel@lists.fedorahosted.org>''')
return
def show_priority_limits(policy):
print("%-32.32s: %d/%d" % (
"%s min/max priority" % schedutils.schedstr(policy),
schedutils.get_priority_min(policy),
schedutils.get_priority_max(policy)
))
def show_all_priority_limits():
for policy in (schedutils.SCHED_OTHER, schedutils.SCHED_FIFO,
schedutils.SCHED_RR, schedutils.SCHED_BATCH):
show_priority_limits(policy)
def show_settings(pid):
policy = schedutils.get_scheduler(pid)
spolicy = schedutils.schedstr(policy)
rtprio = schedutils.get_priority(pid)
reset_on_fork = ""
if policy & schedutils.SCHED_RESET_ON_FORK:
reset_on_fork = "|SCHED_RESET_ON_FORK"
print('''pid %d's current scheduling policy: %s%s
pid %d's current scheduling priority: %d''' % (pid, spolicy, reset_on_fork,
pid, rtprio))
def valid_policy_flag(policy, policy_flag):
if policy_flag == schedutils.SCHED_RESET_ON_FORK and \
policy not in (schedutils.SCHED_RR, schedutils.SCHED_FIFO):
print("SCHED_RESET_ON_FORK flag is supported for SCHED_FIFO and SCHED_RR policies only")
return False
return True
def change_settings(pid, policy, policy_flag, rtprio):
try:
schedutils.set_scheduler(pid, policy | policy_flag, rtprio)
except SystemError as err:
print("sched_setscheduler: %s" % err[1])
print("failed to set pid %d's policy" % pid)
def main():
args = sys.argv[1:]
if not args:
usage()
return
policy = schedutils.SCHED_RR
policy_flag = 0
while True:
o = args.pop(0)
try:
priority = int(o)
break
except:
pass
if o in ("-h", "--help"):
usage()
return
elif o in ("-b", "--batch"):
policy = schedutils.SCHED_BATCH
elif o in ("-f", "--fifo"):
policy = schedutils.SCHED_FIFO
elif o in ("-i", "--idle"):
policy = schedutils.SCHED_IDLE
elif o in ("-m", "--max"):
show_all_priority_limits()
return
elif o in ("-o", "--other"):
policy = schedutils.SCHED_OTHER
elif o in ("-r", "--rr"):
policy = schedutils.SCHED_RR
elif o in ("-R", "--reset-on-fork"):
policy_flag |= schedutils.SCHED_RESET_ON_FORK
elif o in ("-p", "--pid"):
if len(args) > 1:
priority = int(args.pop(0))
pid = int(args.pop(0))
if not valid_policy_flag(policy, policy_flag):
return
change_settings(pid, policy, policy_flag, priority)
else:
pid = int(args.pop(0))
show_settings(pid)
return
else:
usage()
return
if not valid_policy_flag(policy, policy_flag):
return
schedutils.set_scheduler(0, policy | policy_flag, priority)
os.execvp(args[0], args)
if __name__ == '__main__':
main()