2013-05-09 57 views
0

我已经编写了一个代码,用于在我的openSuSE 12.2系统上提高进程的优先级。我怎样才能从boot.local执行我的exe文件

#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开始在启动,sshd的的boostprio exe文件不工作和犯规提升优先级。这仍然是普通的优先事项。下面是图像文件上腻子

enter image description here

看到更进一步,如果我在命令提示符,而不是boot.local在手动调用shell.sh脚本,boostprio正常工作!

这里是printscr

enter image description here

因此,我的/ usr/sbin目录/ boostprio EXE犯规当它从/etc/init.d/boot.local

而且调用工作我在boostprio.c中打印了sched_setscheduler()func,并返回255 我认为这是实际的问题。 但我不知道如何弄清楚?

回答

0

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

在OpenSUSE 12.2(和其他)上,服务statup是独立的,因此你不能依赖boot.local来实现这个目的。在我看来,最好的方法是编写一个init.d脚本谁在依赖于sshd服务(或$ ALL服务),并在启动时稍微等一下(以防万一),然后尝试更改sshd优先级

看看/etc/init.d/skeleton中的脚本为参考谱写新的一个头中具有一些变化;

类似:

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

或...

### BEGIN INIT INFO 
# Provides:   sshprio 
# Required-Start: sshd 
+0

我不认为它关心异步。因为失败是sched_setscheduler。 – roll 2013-05-10 05:42:38

+0

我试过initscript作为/init.d/skeleton.It启动后启动sshd。不幸的是,它不会像以往一样提高优先级。 – roll 2013-05-10 10:57:35