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;
}

次に、boostprio バイナリ ファイルを呼び出す bash スクリプト shell.sh を作成します。

#!/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

シンクロナイゼーションに問題があるようです。(-:

OpenSUSE 12.2 (およびその他) では、サービスの起動は非同期であり、このため 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 に答える