0

我编写了一个代码来提高我的 openSuSE 12.2 系统上进程的优先级。

#include <stdio.h>
#include <sched.h>
#include <unistd.h>

int printUsage(void)
{
    printf("\nUsage:\nboostprio [pid] [priority: (0-99)] [policy: FF:RR:OTH]\n");
    exit (1);
}

int main (int argc , char *argv[])
{
    int pid = -1 ;
    int pri;

    struct sched_param param;

    if(argc != 4 ){
        printf("\nArgument miss match !!");
        printUsage();
        return -1;
        }

    if((strcmp(argv[1],"-h" ) == 0) || (strcmp(argv[1],"--help") == 0))
        printUsage();

    pid = atoi(argv[1]);

    if(pid <= 0){
        printf("\nPid is not correct!!\n");
        return -1;
    }
    pri = atoi(argv[2]);
    if((pri > 99) || (pri < 0)){
        printf("\nPriority value is not valid !!\n");
        return -1;
        }
    param.sched_priority = pri;

    if(strcmp(argv[3],"FF") == 0)
         sched_setscheduler((pid_t)pid, SCHED_FIFO, &param);
    else if(strcmp(argv[3],"RR") == 0)
         sched_setscheduler((pid_t)pid, SCHED_RR, &param);
    else if(strcmp(argv[3],"OTH") == 0)
                 sched_setscheduler((pid_t)pid, SCHED_OTHER, &param);
    else{
        printf("\nInvalid scheduling policy type!!\n");
        printUsage();
        }

    return 0;
}

然后我写了一个bash脚本shell.sh调用boostprio二进制文件

#!/bin/sh

PID=`ps -ef | grep "sshd -p 911" |head -1 | awk '{print $2}'`

/sbin/boostprio $PID 95 RR

if [ "$?" == 0 ]; then
    logger -t "Emergency shell is activated."
else
    logger -t "Emergency shell is NOT activated !!"
fi

虽然新的 sshd -p 911 在启动时启动,但 boostprio exe 不起作用并且不会提高 sshd 的优先级。它仍然是普通的优先级。这是在腻子上看到的图像文件

在此处输入图像描述

此外,如果我在命令提示符而不是 boot.local 上手动调用 shell.sh 脚本,boostprio 可以正常工作!

这里是printscr

在此处输入图像描述

因此,我的 /usr/sbin/boostprio exe 在从 /etc/init.d/boot.local 调用时不起作用

此外,我在 boostprio.c 中打印了 sched_setscheduler() func 并返回 255 失败,我认为这是实际问题。但我不知道如何弄清楚?

4

1 回答 1

0

看起来你有sincronization问题。(-:

在 OpenSUSE 12.2(和其他版本)上,服务状态是 assincronous,因此您不能依赖 boot.local 来执行此操作。在我看来,最好的方法是编写一个依赖于 sshd 服务(或 $ALL 服务)的 init.d 脚本,并在启动时稍等一下(以防万一),然后尝试更改 sshd 优先级

查看 /etc/init.d/skeleton 中的脚本作为参考并编写一个新的脚本,并在标题中进行一些更改;

就像是:

### BEGIN INIT INFO
# Provides:          sshprio
# Required-Start:    $ALL

或者...

### BEGIN INIT INFO
# Provides:          sshprio
# Required-Start:    sshd
于 2013-05-09T11:22:14.367 回答