Problem with chrt
Tom H
tomh0665 at gmail.com
Mon Sep 27 02:32:19 UTC 2010
On Sun, Sep 26, 2010 at 3:22 PM, JD <jd1008 at gmail.com> wrote:
> On 09/26/2010 10:04 AM, Tom H wrote:
>> On Sun, Sep 26, 2010 at 12:33 PM, JD<jd1008 at gmail.com> wrote:
>>> I am trying to run a command in realtime mode just to see
>>> if it behaves any different as far as timings are concerned.
>>>
>>> Man page says:
>>>
>>> chrt - manipulate real-time attributes of a process
>>>
>>> chrt [options] prio command [arg]...
>>> chrt [options] -p [prio] pid
>>>
>>> So, I tried the first example instance above:
>>>
>>> $ sudo chrt 0 ./freq -s120 -u0 -r
>>> chrt: failed to set pid 0's policy: Invalid argument
>>>
>>> Soo I tried:
>>>
>>> $ sudo chrt ./freq -s120 -u0 -r # i.e. no value for priority
>>> chrt: failed to set pid 0's policy: Invalid argument
>> You probably have to enclose "./freq..." in single or double quotes.
>
> $ sudo chrt 0 "./freq -s120 -u0 -r"
> chrt: failed to set pid 0's policy: Invalid argument
> $ sudo chrt 0 './freq -s120 -u0 -r'
> chrt: failed to set pid 0's policy: Invalid argument
>
> Obviously chrt is busted as far as having a command as one of it's
> args is concerned.
> Or so I thought....
>
> Then I decided to use the second form of the command where a PID is
> sspecified,
> ala
>
> chrt [options] -p [prio] PID
>
> The man page says that the option -f sets the scheduling type to FIFO.
>
> So I concocted a way to do that by this script:
>
> #!/bin/sh
> sudo nice --60 ./freq -s120 -u0 -r &
> ps -ef | grep freq | egrep -v 'grep|sudo' | awk '{ print $2 }' | xargs
> sudo chrt -f -p 0
>
> When I ran it, I got:
> [1] 11340 <<<<< This is the pid of the sudo, and not of ./freq
> pid 11348's current scheduling policy: SCHED_OTHER
> pid 11348's current scheduling priority: 0
>
> So, the gist of this is that I requested a FIFO scheduling policy by
> the -f option to chrt.
> Yet, chrt decided to use SCHED_OTHER.
>
> So, I downloaded the source rpm (util-linux-ng)
> and looked at the file chrt.c
>
> The joke is, it does not even parse it's args for the command the user
> wants to run.
> So, the man page ought to dump the first form of invoking chrt; namely
>
> chrt [options] prio command [arg]...
>
> 'cause it is not even being looked for in the args.
>
> To wit (from soource code):
>
> while((i = getopt_long(argc, argv, "+bfiphmorvV", longopts,
> NULL)) != -1)
> {
> int ret = EXIT_FAILURE;
>
> switch (i) {
> case 'b':
> #ifdef SCHED_BATCH
> policy = SCHED_BATCH;
> #endif
> break;
> case 'f':
> policy = SCHED_FIFO;
> break;
> case 'i':
> #ifdef SCHED_IDLE
> policy = SCHED_IDLE;
> #endif
> break;
> case 'm':
> show_min_max();
> return 0;
> case 'o':
> policy = SCHED_OTHER;
> break;
> case 'p':
> errno = 0;
> pid = strtol(argv[argc - 1], NULL, 10);
> if (errno)
> err(EXIT_FAILURE, _("failed to parse
> pid"));
> break;
> case 'r':
> policy = SCHED_RR;
> break;
> case 'v':
> verbose = 1;
> break;
> case 'V':
> printf("chrt (%s)\n", PACKAGE_STRING);
> return 0;
> case 'h':
> ret = EXIT_SUCCESS;
> default:
> show_usage(ret);
> }
> }
>
> if (((pid > -1) && argc - optind < 1) || ((pid == -1) && argc -
> optind < 2))
> show_usage(EXIT_FAILURE);
>
> The if condition always succeeds whether or not you embed the command
> argument and it's args in single or double quotes.
> In fact it never scans of the user command!
You should be able to use pgrep in your script - and you probably
should launch it with "sudo ..." or "su -c ..." rather than include
two sudos in it.
I'd never used (or heard of) chrt before.
I've just tried "chrt 21 yum update" and it ran.
Also "chrt --help" offers different/better help than "man chrt".
More information about the users
mailing list