1

このライブラリを使用して、実行して実行するLinuxコマンドに接続していますが、一部のコマンドに問題があります

たとえば、次のコマンドの実行に問題があります。

トップとトップ -n 1

エラー:TERM 環境変数が設定されていません

private void button2_Click(object sender, EventArgs e)
{
        Renci.SshNet.SshClient sshClient = new Renci.SshNet.SshClient("192.168.150.128", "reza", "1");
        sshClient.Connect();
        var command = sshClient.RunCommand("top");

        var line = command.Result.Split('\n');
        List<ServerStatusCpu> serverstatus = new List<ServerStatusCpu>();
        for (int i = 3; i < line.Length - 1; i++)
        {
            var li = line[i];
            var words = li.Split(' ');
            List<string> fillterwords = new List<string>();

            foreach (var w in words)
            {
                if (w != "")
                {
                    fillterwords.Add(w);
                }
            }

            ServerStatusCpu serverStatus = new ServerStatusCpu();
            serverStatus.Time = fillterwords[0];
            serverStatus.TimeType = fillterwords[1];
            serverStatus.Name = fillterwords[2];
            serverStatus.UserCpuTime = float.Parse(fillterwords[3].Replace("%", ""));
            serverStatus.UserNiceCpuTime = float.Parse(fillterwords[4].Replace("%", ""));
            serverStatus.SystemCpuTime = float.Parse(fillterwords[5].Replace("%", ""));
            serverStatus.IoWaitCpuTime = float.Parse(fillterwords[6].Replace("%", ""));
            serverStatus.IrqCpuTime = float.Parse(fillterwords[7].Replace("%", ""));
            serverStatus.SoftwareIrqCpuTime = float.Parse(fillterwords[8].Replace("%", ""));
            serverStatus.StealCpuTime = float.Parse(fillterwords[9].Replace("%", ""));
            serverStatus.GuestCpuTime = float.Parse(fillterwords[10].Replace("%", ""));
            serverStatus.IdleCpuTime = float.Parse(fillterwords[11].Replace("%", ""));

            serverstatus.Add(serverStatus);
        }
        dataGridView1.DataSource = serverstatus;
 }


class ServerStatusCpu
{
   public class ServerStatusCpu
   {
        public string Time { get; set; }

        public string TimeType { get; set; }

        public string Name { get; set; }

        public float UserCpuTime { get; set; }

        public float SystemCpuTime { get; set; }

        public float UserNiceCpuTime { get; set; }

        public float IdleCpuTime { get; set; }

        public float IoWaitCpuTime { get; set; }

        public float IrqCpuTime { get; set; }

        public float SoftwareIrqCpuTime { get; set; }

        public float StealCpuTime { get; set; }

        public float GuestCpuTime { get; set; }
    }
}
4

2 に答える 2

1

あなたが抱えている問題は、入力がどの TERM にリダイレクトされるべきかをサーバーが認識していないという事実に関連しています。

http://www.linuxquestions.org/questions/programming-9/term-environment-variable-not-set-593180/をご覧ください。

出力を取得する前に、TERM 変数を設定する必要があります。

于 2013-05-14T13:12:57.840 に答える
1

これを使って:top -n1b

コマンドライン引数ありb

top を「バッチ」モードで開始します。これは、top からの出力を他のプログラムまたはファイルに送信するのに役立ちます。このモードでは、top は入力を受け付けず、'-n' コマンドライン オプションで設定した反復制限まで、または強制終了されるまで実行されます。

詳細なヘルプ情報を参照してくださいman top

ところで --

素敵なコードサンプル、これはあなたのコードへの私のバージョンの参照です:)

使用済みMoreLINQ、結果を返すためにコードを追加する必要があります。

static void ParseTop(string contentOfOutput)
{
    var line = contentOfOutput.Split('\n');

    //parse uptime/user/load.avg
    var lineUud = line[0].Substring("top -".Length);

    var wordsUud = lineUud.Split(new[] { "up", "load average:", ",", " " }, StringSplitOptions.RemoveEmptyEntries);
    //00:00:00 up 0  days, 17:51,  0  users,  load average: 0.00, 0.01, 0.05
    //^0          ^1 ^2    ^3      ^4 ^5(unused)            ^6    ^7    ^8
    //00:00:00 up 0  min,  1  user,  load average: 0.00, 0.01, 0.05
    //^0          ^1 ^2    ^3 ^4(unused)           ^5    ^6    ^7

    var time = TimeSpan.Parse(wordsUud[0]);
    if (wordsUud[2] == "days")
    {
        var uptime = TimeSpan.Parse(wordsUud[1] + "." + wordsUud[3] + ":00");
        var users = int.Parse(wordsUud[4]);
        var la1Min = float.Parse(wordsUud[5]);
        var la5Min = float.Parse(wordsUud[6]);
        var la15Min = float.Parse(wordsUud[7]);
    }
    else
    {
        var uptime = TimeSpan.Parse("00:" + wordsUud[1] + ":00");
        var users = int.Parse(wordsUud[3]);
        var la1Min = float.Parse(wordsUud[4]);
        var la5Min = float.Parse(wordsUud[5]);
        var la15Min = float.Parse(wordsUud[6]);
    }


    //parse tasks
    var lineTasks = line[1].Substring("Tasks:".Length);

    var wordTasks = lineTasks.Split(new[] { "total", "running", "sleeping", "stopped", "zombie", ",", " " }, StringSplitOptions.RemoveEmptyEntries);
    //70 total,   1 running,  69 sleeping,   0 stopped,   0 zombie
    //^0          ^1          ^2             ^3           ^4
    var totalTasks = int.Parse(wordTasks[0]);
    var runningTasks = int.Parse(wordTasks[1]);
    var sleepingTasks = int.Parse(wordTasks[2]);
    var stoppedTasks = int.Parse(wordTasks[3]);
    var zombieTasks = int.Parse(wordTasks[4]);

    //parse cpu
    var cpus = new Dictionary<string, Dictionary<string, float>>();

    var cpuLineIndex = 2;
    string cpuLine;
    while ((cpuLine = line[cpuLineIndex]).StartsWith("%Cpu"))
    {
        var wordCpu = cpuLine.Split(new[] { "%Cpu", ":", ",", " " }, StringSplitOptions.RemoveEmptyEntries);
        //%Cpu(s):  0.2 us,  0.6 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
        //%Cpu1  :  0.2 us,  0.6 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
        //    ^0    ^1  ^2   ^3  ^4   ^5  ^6  ^7   ^8   ^9  ^10  ^11 ^12  ^13 ^14  ^15 ^16

        var cpu = new Dictionary<string, float>();
        foreach (var entry in wordCpu.Skip(1).Batch(2).Where(p => p.Count() == 2).Select(p => p.ToArray()))
        {
            cpu[entry[1]] = float.Parse(entry[0]);
        }

        cpus[wordCpu[0]] = cpu;
        cpuLineIndex++;
    }

    //parse memory/swap
    var memories = new Dictionary<string, Dictionary<string, int>>();

    var memLineIndex = cpuLineIndex;
    string memLine;
    while ((memLine = line[memLineIndex]).StartsWith("KiB"))
    {
        var wordMem = memLine.Split(new[] { "KiB", ":", ",", " " }, StringSplitOptions.RemoveEmptyEntries);
        //KiB Mem:    993780 total,   968936 used,    24844 free,   418236 buffers
        //KiB Swap:   524284 total,        0 used,   524284 free,   506312 cached
        //    ^0      ^1     ^2       ^3     ^4      ^5     ^6      ^7     ^8

        var mem = new Dictionary<string, int>();
        foreach (var entry in wordMem.Skip(1).Batch(2).Where(p => p.Count() == 2).Select(p => p.ToArray()))
        {
            mem[entry[1]] = int.Parse(entry[0]);
        }

        memories[wordMem[0]] = mem;
        memLineIndex++;
    }


    //parse process
    var process = new List<Dictionary<string, string>>();

    var lineNumOfBlank = Array.IndexOf(line, "");
    var headers = line[lineNumOfBlank + 1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

    for (var i = lineNumOfBlank + 2; i < line.Length - 1; i++)
    {
        var li = line[i];
        var strings = li.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

        var dic = new Dictionary<string, string>();
        for (var j = 0; j < headers.Length; j++)
        {
            dic[headers[j]] = strings[j];
        }

        if (strings.Length > headers.Length) //process name has space?
        {
            for (var j = headers.Length; j < strings.Length; j++)
            {
                dic[headers[headers.Length - 1]] += " " + strings[j];
            }
        }

        process.Add(dic);
    }
}
于 2015-09-12T09:24:32.343 に答える