johnpoint

johnpoint

(。・∀・)ノ゙嗨
github

Linux プロセス情報のフォーマット

2021 年になり、自分のサーバーパネルを見返してみると、まだ半完成のままだとわかりました... そこで、この 3 日間でコードを改良し、v2 API インターフェースを追加しました。このインターフェースは、主に Websocket を使用して通信を行います。サーバーの負荷は実際にはそれほど大きくありませんが、データの更新にポーリングを使用すると、たくさんのリクエストが表示されるだけでなく、私のパソコンにとっても少し負担がかかります。ただ、この記事の内容はそれではありませんので、別の記事で記録することにします。

プロセスの表示は、実はかなり以前からパネルの機能の一部として作りたかったものですが、既成の Go サードパーティライブラリや公式ライブラリが見つからなかったため、一時保留になっていました (結果的に約 1 年間)。ちょうどこの数日間、パネルのコードを改良していたので、ついでに作ってしまいました。

プロセスの表示には呼び出せるライブラリがないため、システムコマンドを呼び出して表示するしかありません。一般的に私はプロセスを表示するために ps -aux を使用しますが、パネルでは、ここで出力されるデータが少し多すぎて、少し乱雑です(乱雑とは、出力されるデータがコンピュータフレンドリーな構造ではないことを指します)。そして、オンラインのユーザーたちが様々なコマンドを提供しているのを見て、それを組み合わせて最終的なコマンドを作りました。最終的なコマンドは ps axc -o pid,user,stat,pcpu,pmem,command --sort -pcpu --no-header | sed 's/\ \+/\ /g' で、ヘッダーがなく、連続したスペースが 1 つのスペースに置換されたデータが得られます。これで十分だと思います。他の処理はフロントエンドに任せます。

フロントエンドのコードは以下のようになります。

let ps = server.Ps.split('\n');
ps.forEach(item => {
    if (item.split(" ").length > 3) {
        item = item.split(" ");
        if (item[0] === "") {
            item = item.slice(1, item.length);
        }
        let i = {
            PID: item[0],
            User: item[1],
            State: item[2],
            Pcpu: item[3],
            Pmem: item[4],
            Command: item.slice(5, item.length).toString().replaceAll(",", " "),
        };
        this.psData.push(i);
    }
});

最終的な結果はかなり良かったです〜

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。