web-dev-qa-db-ja.com

ファイルシステム使用状況インジケータ

パネルにファイルシステムの使用量(パーティション用の空き領域%)を示すだけの適切なユーティリティが見つかりません。

そして、私は悪い種類のデスクトップ管理ツールをインストールするのではなく、簡単な指標をインストールするのを楽しみにしています。

すべての提案に感謝します。

10

編集:

1.新しい回答

これの一番下にある回答を使用できますが([2.]を参照)、追加のオプションを持つppa-バージョンが設定ウィンドウに設定されます。

enter image description here

enter image description here

オプションが含まれます:

  • 1つのウィンドウですべてのエイリアスを設定する
  • パネルアイコンのテーマカラーの設定:

    enter image description hereenter image description hereenter image description hereenter image description here

  • 警告のしきい値を設定する
  • 通知で新しくマウント/接続されたボリュームに関する情報を表示します。

    enter image description here

  • 起動時に実行

さらに、このインジケーターには、他のディストリビューション(xfceなど)用に設定された小さい(幅)アイコンが含まれ、ウィンドウマネージャーに応じて自動的に適用されます。

enter image description here

インストールする:

Sudo add-apt-repository ppa:vlijm/spaceview
Sudo apt-get update
Sudo apt-get install spaceview



2.古い回答

以下のスクリプトは、デバイスをリストし、その使用状況を示すインジケーターです。情報は10秒ごとに1回(必要な場合)更新されます。

enter image description here

さらに

  • インジケータの実行中に、アイコンに表示するデバイスを選択できます。デバイスは、次回インジケーターを実行したときに記憶されます。

    enter image description here

    ![enter image description here

    enter image description here

  • 1つ以上(またはすべて)のデバイスの場合、代替名(「カスタム名」)を設定して、スクリプトの先頭に設定できます

    例として、これ:

    alias = [
        ["sdc1", "stick"],
        ["sdb1", "External"],
        ["sda2", "root"],
        ["sda4", "ntfs1"],
        ["sda5", "ntfs2"],
        ["//192.168.0.104/media", "netwerk media"],
        ["//192.168.0.104/werkmap_documenten", "netwerk docs"],
        ]
    

    表示されます:

    enter image description here

  • threshhold;を設定できます。いずれかのデバイスの空き容量がそれよりも少ない場合、警告が表示されます。

    enter image description here

  • 差し込まれた/取り外されたデバイスは、10秒以内にメニューリストに追加/削除されます。

スクリプト

#!/usr/bin/env python3
import subprocess
import os
import time
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
from threading import Thread

#--- set alias names below in the format [[device1, alias1], [device2, alias2]]
#--- just set alias = [] to have no custom naming
alias = []
#--- set the threshold to show a warning below 
#--- set to 0 to have no warning
threshold = 17
#---
currpath = os.path.dirname(os.path.realpath(__file__))
prefsfile = os.path.join(currpath, "showpreferred")

class ShowDevs():
    def __init__(self):
        self.default_dev = self.get_showfromfile()
        self.app = 'show_dev'
        iconpath = currpath+"/0.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())
        self.indicator.set_label("Starting up...", self.app)
        self.update = Thread(target=self.check_changes)
        self.update.setDaemon(True)
        self.update.start()

    def check_changes(self):
        state1 = None
        while True:
            self.state2 = self.read_devices()
            if self.state2 != state1:
                self.update_interface(self.state2)
            state1 = self.state2
            time.sleep(10)

    def update_interface(self, state):
        warning = False; self.newmenu = []
        for dev in state:
            mention = self.create_mention(dev)
            name = mention[0]; deci = mention[2]; n = mention[1]
            if n <= threshold:
                warning = True
            try:
                if self.default_dev in name:
                    newlabel = mention[3]
                    newicon = currpath+"/"+str(10-deci)+".png"
            except TypeError:
                pass
            self.newmenu.append(name+" "+str(n)+"% free")
        if warning:
            newlabel = "Check your disks!"
            newicon = currpath+"/10.png"
        try:
            self.update_indicator(newlabel, newicon)
        except UnboundLocalError:
            labeldata = self.create_mention(state[0])
            newlabel = labeldata[3]
            newicon = currpath+"/"+str(10-labeldata[2])+".png"
            self.update_indicator(newlabel, newicon)
        GObject.idle_add(self.set_new, 
            priority=GObject.PRIORITY_DEFAULT)  

    def update_indicator(self, newlabel, newicon):
        GObject.idle_add(self.indicator.set_label,
            newlabel, self.app,
            priority=GObject.PRIORITY_DEFAULT)   
        GObject.idle_add(self.indicator.set_icon,
            newicon,
            priority=GObject.PRIORITY_DEFAULT)

    def set_new(self):
        for i in self.initmenu.get_children():
            self.initmenu.remove(i)
        for item in self.newmenu:
            add = Gtk.MenuItem(item)
            add.connect('activate', self.change_show)
            self.initmenu.append(add) 
        menu_sep = Gtk.SeparatorMenuItem()
        self.initmenu.append(menu_sep)
        self.item_quit = Gtk.MenuItem('Quit')
        self.item_quit.connect('activate', self.stop)
        self.initmenu.append(self.item_quit)
        self.initmenu.show_all()

    def change_show(self, *args):
        index = self.initmenu.get_children().index(self.initmenu.get_active())
        self.default_dev = self.newmenu[index].split()[0]
        open(prefsfile, "wt").write(self.default_dev)
        self.update_interface(self.read_devices())

    def create_mention(self, dev):
        name = dev[1] if dev[1] else dev[0]
        n = dev[2]; deci = round(dev[2]/10)
        newlabel = name+" "+str(n)+"% free"
        return (name, n, deci, newlabel)        

    def create_menu(self):
        # create initial basic menu
        self.initmenu = Gtk.Menu()
        self.item_quit = Gtk.MenuItem('Quit')
        self.item_quit.connect('activate', self.stop)
        self.initmenu.append(self.item_quit)
        self.initmenu.show_all()
        return self.initmenu

    def read_devices(self):
        # read the devices, look up their alias and the free sapace
        devdata = []
        data = subprocess.check_output(["df", "-h"]).decode("utf-8").splitlines()
        relevant = [l for l in data if all([
                    any([l.startswith("/dev/"), l.startswith("//")]),
                    not "/loop" in l])
                    ]
        for dev in relevant:
            data = dev.split(); name = data[0]; pseudo = None       
            free = 100-int([s.strip("%") for s in data if "%" in s][0])
            for al in alias:
                if al[0] in name:
                    pseudo = al[1]
                    break
            devdata.append((name, pseudo, free)) 
        return devdata

    def get_showfromfile(self):
        # read the preferred default device from file
        try:
            defdev = open(prefsfile).read().strip()
        except FileNotFoundError:
            defdev = None
        return defdev

    def stop(self, source):
        Gtk.main_quit()

ShowDevs()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

アイコン

enter image description here0.png

enter image description here1.png

enter image description here2.png

enter image description here3.png

enter image description here4.png

enter image description here5.png

enter image description here6.png

enter image description here7.png

enter image description here8.png

enter image description here9.png

enter image description here10.png

設定中

設定は簡単です:

  • スクリプトを空のファイルにコピーし、showusage.pyとして保存します
  • 上記のアイコンをラベルとまったく同じ名前で、スクリプトとまったく同じディレクトリに保存します(右クリック> [名前を付けて保存])
  • スクリプトのヘッドセクションで、(可能な)代替名(aliasses)を設定します。例の下:

    alias = [
        ["sda2", "root"],
        ["sdb1", "External"]
        ]
    

    デバイスを変更せずに表示する場合は、次を使用します。

    alias = []
    

    ...また、必要に応じて、しきい値を変更して警告を表示します。

    #--- set the threshold to show a warning below (% free, in steps of 10%)
    #--- set to 0 to have no warning
    threshold = 10
    

    それだけです

それを実行する

インジケーターを使用するには、次のコマンドを実行します。

python3 /path/to/showusage.py

スタートアップアプリケーションに追加するには、次のコマンドを使用します。

/bin/bash -c "sleep 10 && python3 /path/to/showusage.py"

アプリケーション:ダッシュ>スタートアップアプリケーション>追加を選択し、上記のコマンドを追加します。

19
Jacob Vlijm

免責事項:私はこの指標の著者であり、この特定の質問のために書かれています

2018年10月23日更新

インジケーターは、 ネットワーク共有のリスト をサポートするようになりました。 mihaigalos に感謝

2016年10月29日更新

インジケーターにはアンマウント機能があり、エイリアスはsda1などのブロックデバイス名の代わりに各パーティションのUUIDを参照することで一意になりました。 関連バグレポート を参照してください

アップデート、2016年10月8日

インジケーターは現在バージョン2.0であり、いくつかの機能が追加され、独自のPPAがあります。

PPAからインストールするには、ターミナルで次の手順を使用します。

  1. Sudo apt-add-repository ppa:udisks-indicator-team/ppa
  2. Sudo bash -c 'apt-get update && apt-get install udisks-indicator'

リリースノート で述べたように、機能には以下が含まれます。

  • メニューエントリのアイコン:各パーティション/デバイスには、適切なアイコンが添付されています。デバイスがusb diskの場合、リムーバブルメディアアイコンが使用され、isoイメージの場合-光ディスクアイコンが使用され、明らかにハードドライブ/ SSDパーティションにはドライブアイコンがあります。
  • 使用率は、パーセンテージと人間が読み取れる値(1024の累乗)で表示されるようになりました。
  • 使用状況バーを介した使用状況のグラフィカルな表示(Mateo Saltaのアイデアに感謝)
  • 設定ダイアログ:ユーザーは、各メニューエントリごとに表示したくない特定のフィールドをオフにすることができます。これにより、大量のパーティションが接続されている場合にインジケーターメニューをきれいに保つことができます。 (ザカリーのリクエストに感謝)
  • テキストの間隔:デフォルトのUbuntuフォントとMonospaceフォントを使用すると、テキストエントリはきれいに表示され、情報の読みやすさが向上します。
  • パーティションをマウントできない場合の通知バブル

以下は、デフォルトのUbuntuアイコンテーマのスクリーンショットです。 enter image description here

Ubuntu Kylinアイコンテーマ

enter image description here

すべてのオプションフィールドがオフの場合

enter image description here

設計の選択と追加の考え:

この指標を作成するにあたり、私は上級ユーザーにもカジュアルなユーザーにも適したユーティリティを実現したいと考えました。私は、新しいユーザーがコマンドラインツールを処理する際に気付くことがあるいくつかの問題に対処しようとしました。さらに、ユーティリティは多目的になるよう努めています。

[設定]ダイアログを使用すると、インジケーターをユーザーが望むように複雑にしたり、シンプルにしたりできます。また、トップパネルにラベルを付けないようにして、ユーザーのトップパネルのスペースをあまり占有しないようにすることも、特定の設計上の決定でした。さらに、このインジケーターは、パーティションをマウントしたり、それぞれのディレクトリを開いたりできる多目的ユーティリティになるよう努めています。これは、ディスク使用ユーティリティとしてだけでなく、ディレクトリをすばやく開くためのナビゲーションユーティリティとしても使用できます。

また、ユーザーがどのパーティションがどのディスクに存在するかを知ることは便利です。したがって、mountなどのコマンドラインユーティリティを介したマウントとの頻繁な混乱を回避できます。代わりに、その目的のためにudisksctlを使用します(また、UDisks2デーモンから情報を取得するため、命名します)。実行されない唯一のタスクは、アンマウント、またはこの理由でOpen Disks Utilityメニューエントリが含まれていることです。

もともと、私はiStat menuletに似せようと努力していましたが、プロジェクトはこの目標とは異なりました-インジケーターは、そのデザインと目的においてユニークです。多くのユーザーにとって有用であり、Ubuntuの体験がより快適になることを願っています。


udisks-indicator(元の回答)

Unityデスクトップを使用したUbuntuのディスク使用量を示すインジケーター Sample Screenshot

概要

Unityを使用したUbuntuのこのインジケーターにより、マウントされたパーティションに関する情報を簡単に表示できます。 OS XのiStat Menu 3メニューレットに視覚的に類似するよう努めています。

エントリは順番に整理されます。

  • パーティション
  • エイリアス(ユーザーが設定した場合)
  • パーティションが属するディスクドライブ
  • パーティションのマウントポイント(ディレクトリ)
  • % 使用法

各パーティションエントリをクリックすると、デフォルトのファイルマネージャーでパーティションのマウントポイントが開きます

「マウントされていないパーティション」メニューには、システムによって現在マウントされていないすべてのパーティションが一覧表示されます。そのサブメニューの任意のエントリをクリックすると、そのパーティションが自動的にマウントされます。通常、/media/username/drive-idフォルダーにマウントされます

インジケーターはシステムに用意されているデフォルトのアイコンを使用するため、Unity Tweak Toolまたは他の方法を使用してアイコンテーマを変更すると、アイコンも変更されます。

NOTE:「エイリアスの作成」オプションを使用して、1つずつではなく複数のエイリアスを同時に追加する場合は、追加できます。 ~/.partition_aliases.json構成ファイルを編集します。形式は次のとおりです。

{
    "sda1": "Alias 1",
    "sda2": "Alias 2",
    "sdb1": "Alias 3"
}

Installation

簡単なインストールのためのPPAはすぐに来ています。 。 。

それまでの間、代替手順は次のとおりです。

  1. cd /tmp
  2. wget https://github.com/SergKolo/udisks-indicator/archive/master.Zip
  3. unzip master.Zip
  4. Sudo install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
  5. Sudo install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop

これらすべての手順は、素敵な小さなインストールスクリプトに入れることができます。

#!/bin/bash

cd /tmp
rm master.Zip*
wget https://github.com/SergKolo/udisks-indicator/archive/master.Zip
unzip master.Zip
install udisks-indicator-master/udisks-indicator /usr/bin/udisks-indicator
install udisks-indicator-master/udisks-indicator.desktop /usr/share/applications/udisks-indicator.desktop

ソースコード

このインジケーターの基本機能を備えた元のソースコード(バージョンv1.0)は、以下にあります。最新の機能については、 このプロジェクトのGitHubリポジトリ を確認してください。 GitHubで機能のリクエストとエラーを報告してください。

/usr/bin/udisks-indicator

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#
# Author: Serg Kolo , contact: [email protected]
# Date: September 27 , 2016
# Purpose: appindicator for displaying mounted filesystem usage
# Tested on: Ubuntu 16.04 LTS
#
#
# Licensed under The MIT License (MIT).
# See included LICENSE file or the notice below.
#
# Copyright © 2016 Sergiy Kolodyazhnyy
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import gi
gi.require_version('AppIndicator3', '0.1')
from gi.repository import GLib as glib
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Gtk as gtk
from os import statvfs
#from collections import OrderedDict
import subprocess
import shutil
import dbus
import json
import os

class UdisksIndicator(object):

    def __init__(self):
        self.app = appindicator.Indicator.new(
            'udisks-indicator', "drive-harddisk-symbolic.svg",
            appindicator.IndicatorCategory.HARDWARE
            )

        if not self.app.get_icon():
           self.app.set_icon("drive-harddisk-symbolic")

        self.app.set_status(appindicator.IndicatorStatus.ACTIVE)

        filename = '.partition_aliases.json'
        user_home = os.path.expanduser('~')
        self.config_file = os.path.join(user_home,filename)
        self.cache = self.get_partitions()
        self.make_menu()
        self.update()


    def update(self):
        timeout = 5
        glib.timeout_add_seconds(timeout,self.callback)

    def callback(self):
        if self.cache != self.get_partitions():
            self.make_menu()
        self.update()        

    def make_menu(self,*args):
        """ generates entries in the indicator"""
        if hasattr(self, 'app_menu'):
            for item in self.app_menu.get_children():
                self.app_menu.remove(item)

        self.app_menu = gtk.Menu()

        partitions = self.get_partitions()
        for i in partitions:

            part = "Partition: " + i[0]
            alias = self.find_alias(i[0])
            drive = "\nDrive: " + i[1]
            mount = "\nMountPoint: " + i[2]
            usage = "\n%Usage: " + i[3]

            item = part + drive + mount + usage
            if alias:
                alias = "\nAlias: " + alias
                item = part + alias + drive + mount + usage

            self.menu_item = gtk.MenuItem(item)
            self.menu_item.connect('activate',self.open_mountpoint,i[2])
            self.app_menu.append(self.menu_item)
            self.menu_item.show()

            self.separator = gtk.SeparatorMenuItem()
            self.app_menu.append(self.separator)
            self.separator.show()

        self.unmounted = gtk.MenuItem('Unmounted Partitions')
        self.unmounted_submenu = gtk.Menu()
        self.unmounted.set_submenu(self.unmounted_submenu)

        for i in self.get_unmounted_partitions():

            # TODO: add type checking, prevent swap

            part = "Partition: " + i[0]
            alias = self.find_alias(i[0])
            drive = "\nDrive: " + i[1]
            label = part + drive
            if alias: 
               alias = "\nAlias: " + alias
               label = part + alias + drive

            self.menu_item = gtk.MenuItem(label)
            self.menu_item.connect('activate',self.mount_partition,i[0])
            self.unmounted_submenu.append(self.menu_item)
            self.menu_item.show()

            self.separator = gtk.SeparatorMenuItem()
            self.unmounted_submenu.append(self.separator)
            self.separator.show()

        self.app_menu.append(self.unmounted)
        self.unmounted.show()


        self.separator = gtk.SeparatorMenuItem()
        self.app_menu.append(self.separator)
        self.separator.show()

        self.make_part_alias = gtk.MenuItem('Make Alias')
        self.make_part_alias.connect('activate',self.make_alias)
        self.app_menu.append(self.make_part_alias)
        self.make_part_alias.show()

        user_home = os.path.expanduser('~')
        desktop_file = '.config/autostart/udisks-indicator.desktop'
        full_path = os.path.join(user_home,desktop_file)

        label = 'Start Automatically' 
        if os.path.exists(full_path):
           label = label + ' \u2714'
        self.autostart = gtk.MenuItem(label)
        self.autostart.connect('activate',self.toggle_auto_startup)
        self.app_menu.append(self.autostart)
        self.autostart.show()

        self.open_gnome_disks = gtk.MenuItem('Open Disks Utility')
        self.open_gnome_disks.connect('activate',self.open_disks_utility)
        self.app_menu.append(self.open_gnome_disks)
        self.open_gnome_disks.show()

        self.quit_app = gtk.MenuItem('Quit')
        self.quit_app.connect('activate', self.quit)
        self.app_menu.append(self.quit_app)
        self.quit_app.show()

        self.app.set_menu(self.app_menu)

    def mount_partition(self,*args):
        # TODO: implement error checking for mounting
        return self.run_cmd(['udisksctl','mount','-b','/dev/' + args[-1]])

    def get_mountpoint_usage(self,mountpoint):
        fs = statvfs(mountpoint)
        usage = 100*(float(fs.f_blocks)-float(fs.f_bfree))/float(fs.f_blocks)
        return str("{0:.2f}".format(usage))

    def get_partitions(self):
        objects = self.get_dbus('system', 
                           'org.freedesktop.UDisks2', 
                           '/org/freedesktop/UDisks2', 
                           'org.freedesktop.DBus.ObjectManager',
                           'GetManagedObjects',
                           None)


        partitions = []
        for item in objects:
            try:
                if 'block_devices'  in str(item):


                       drive = self.get_dbus_property('system',
                                        'org.freedesktop.UDisks2',
                                        item,
                                        'org.freedesktop.UDisks2.Block',
                                        'Drive')
                       if drive == '/': continue

                       mountpoint = self.get_mountpoint(item)
                       if not mountpoint: continue
                       mountpoint = mountpoint.replace('\x00','')

                       drive = str(drive).split('/')[-1]
                       usage = self.get_mountpoint_usage(mountpoint)

                       part = str(item.split('/')[-1])
                       partitions.append((part,drive,mountpoint,usage))                       

            except Exception as e:
                #print(e)
                pass

        # returning list of tuples
        partitions.sort()
        return partitions

    def get_mountpoint(self,dev_path):
        try:
            data = self.get_dbus_property(
                             'system',
                             'org.freedesktop.UDisks2',
                             dev_path,
                             'org.freedesktop.UDisks2.Filesystem',
                             'MountPoints')[0]

        except Exception as e:
            #print(e)
            return None
        else:
            if len(data) > 0:
                return ''.join([ chr(byte) for byte in data])


    def get_unmounted_partitions(self):
        objects = self.get_dbus('system', 
                           'org.freedesktop.UDisks2', 
                           '/org/freedesktop/UDisks2', 
                           'org.freedesktop.DBus.ObjectManager',
                           'GetManagedObjects',
                           None)


        partitions = []
        for item in objects:
            try:
                if 'block_devices'  in str(item):
                       drive = self.get_dbus_property('system',
                                        'org.freedesktop.UDisks2',
                                        item,
                                        'org.freedesktop.UDisks2.Block',
                                        'Drive')
                       if drive == '/': continue

                       mountpoint = self.get_mountpoint(item)
                       if  mountpoint: continue

                       drive = str(drive).split('/')[-1]
                       part = str(item.split('/')[-1])
                       if not part[-1].isdigit(): continue
                       partitions.append((part,drive))                       
                       #print(partitions)

            except Exception as e:
                #print(e)
                pass

        partitions.sort()
        return partitions

    def get_dbus(self,bus_type,obj,path,interface,method,arg):
        if bus_type == "session":
            bus = dbus.SessionBus() 
        if bus_type == "system":
            bus = dbus.SystemBus()
        proxy = bus.get_object(obj,path)
        method = proxy.get_dbus_method(method,interface)
        if arg:
            return method(arg)
        else:
            return method()

    def get_dbus_property(self,bus_type,obj,path,iface,prop):

        if bus_type == "session":
           bus = dbus.SessionBus()
        if bus_type == "system":
           bus = dbus.SystemBus()
        proxy = bus.get_object(obj,path)
        aux = 'org.freedesktop.DBus.Properties'
        props_iface = dbus.Interface(proxy,aux)
        props = props_iface.Get(iface,prop)
        return props

    def make_alias(self,*args):
        partitions = [ i[0] for i in self.get_partitions() ]

        combo_values = '|'.join(partitions)
        #print(combo_values)
        command=[ 'zenity','--forms','--title','Make Alias',
                  '--add-combo','Partition','--combo-values',
                  combo_values,'--add-entry','Alias'    ]        
        user_input = self.run_cmd(command)
        if not user_input: return

        alias = user_input.decode().strip().split('|')

        existing_values = None

        if os.path.isfile(self.config_file):
            with open(self.config_file) as conf_file:
                try:
                    existing_values = json.load(conf_file)
                except ValueError:
                    pass


        with open(self.config_file,'w') as conf_file:
             if existing_values:
                 existing_values[alias[0]] = alias[1]
             else:
                 existing_values = {alias[0]:alias[1]}

             #print(existing_values)
             json.dump(existing_values,conf_file,indent=4,sort_keys=True)


    def find_alias(self,part):
        if os.path.isfile(self.config_file):
            with open(self.config_file) as conf_file:
                try:
                    aliases = json.load(conf_file)
                except ValueError:
                    pass
                else:
                    if part in aliases:
                       return aliases[part]
                    else:
                       return None

    def toggle_auto_startup(self,*args):
        user_home = os.path.expanduser('~')
        desktop_file = '.config/autostart/udisks-indicator.desktop'
        full_path = os.path.join(user_home,desktop_file)

        if os.path.exists(full_path):
           os.unlink(full_path)
        else:
           original = '/usr/share/applications/udisks-indicator.desktop'
           if os.path.exists(original):
               shutil.copyfile(original,full_path)

        self.make_menu()


    def open_mountpoint(self,*args):
        pid = subprocess.Popen(['xdg-open',args[-1]]).pid

    def open_disks_utility(self,*args):
        pid = subprocess.Popen(['gnome-disks']).pid

    def run_cmd(self, cmdlist):
        """ Reusable function for running external commands """
        new_env = dict(os.environ)
        new_env['LC_ALL'] = 'C'
        try:
            stdout = subprocess.check_output(cmdlist, env=new_env)
        except subprocess.CalledProcessError:
            pass
        else:
            if stdout:
                return stdout

    def run(self):
        """ Launches the indicator """
        try:
            gtk.main()
        except KeyboardInterrupt:
            pass

    def quit(self, data=None):
        """ closes indicator """
        gtk.main_quit()

def main():
    """ defines program entry point """
    indicator = UdisksIndicator()
    indicator.run()

if __== '__main__':
    main()

/usr/share/applications/udisks-indicator.desktop

[Desktop Entry]
Version=1.0
Name=Udisks Indicator
Comment=Indicator for reporting partition information
Exec=udisks-indicator
Type=Application
Icon=drive-harddisk-symbolic.svg
Terminal=false

追加情報:

Ubuntu Mate 16.04テスト:

enter image description here

Gnomeユーザーは、インジケーターを適切に動作させるために拡張機能(KStatusNotifierItem/AppIndicator Support)が必要です。

enter image description here

14

インストール Sysmonitorインジケーター

Sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
Sudo apt-get update
Sudo apt-get install indicator-sysmonitor

また、「ファイルシステムで使用可能なスペース」オプションがあります。

4
Bernmeister

基本的な Sysmonitorインジケーター を使用した別の回答がありますが、好きなだけの情報を含む独自のカスタムパネルを作成できます。

Google(少なくとも検索)はあなたの友達です

最初のステップは、パーティションの使用率の計算方法 を把握することです

$ percentage=($(df -k --output=pcent /dev/sda1))
$ echo "${percentage[1]}"
13%

パネルにエコーするbashスクリプトを作成します

Sysmonitor Indicatorで「カスタム」オプションとして使用するbashスクリプトを次に示します。 /dev/sdaの最初の3つのパーティションで使用されている割合が表示されます。

#!/bin/bash
echo "sda1: "
percentage=($(df -k --output=pcent /dev/sda1))
echo "${percentage[1]}"
echo " | sda2: "
percentage=($(df -k --output=pcent /dev/sda2))
echo "${percentage[1]}"
echo " | sda3: "
percentage=($(df -k --output=pcent /dev/sda3))
echo "${percentage[1]}"

サンプル出力

実行すると、次のようになります。

indicator systmonitor example.png

Sysmonitorインジケーターでカスタムスクリプトをインストールおよび構成する

Sysmonitor Indicatorのインストールおよびカスタムスクリプトの割り当ての詳細な手順については、この回答を参照してください: BASHはアプリケーションインジケータとしてsystrayに表示できますか?

1