すべてのGUIベースのタスクを代替のコマンドライン形式でログファイルに表示できますか?


9

たとえば、私は通常、アプリケーションメニューからマウスパッド(geditに相当するxfce)を開きます。ただし、ターミナルでと入力してこれを実行することもできますmousepad

この例に続いて、GUIを介してマウスパッドを開くたびに、ログファイルに新しい行が書き込まれ、次のようになりSep 5 15:35:11 lucho@lucho:~$ mousepadます。より一般的には、コマンドラインを介して実行できる可能性のあるすべてのGUIアクティビティ(プログラムを開く、アクセス許可を変更する、システム設定を変更するなど)をログに記録し、代わりのコマンドライン実行形式で記述します。これは、コマンドラインの使用方法に関する知識を向上させるために必要です(manページを経由せずに)。コマンドライン(スクリプトまたはキーボードショートカットを介して自動化できるものもある)を介して実行しないGUIを介して実行する多くのことがあり、このログファイルがあると、それらを学習するのに適した方法になります。

にsyslogファイルが存在することは知っていますが/var/log、それは必要ではありません。私の知る限り、UbuntuリポジトリのActivity Log Managerアプリはコマンドライン形式を表示しません。ホームフォルダーにある.bash_historyファイルのようなものが必要ですが、GUIベースのアクティビティを記録しています。


straceなどのツールを使用して、実行中のプログラムを覗き込んで、それが行うシステムコールを確認できます。これにより、大量のデータが生成されます
Amias

GUIで開くプログラムのバイナリ名を単純にログに記録するプログラムを探している場合は、スクリプトでそれを行うことができます。よろしければ、お知らせください。実際の要件を明確にした方がよいので、質問を編集してください。これらは、実際のシェルコマンドに接続されていないため、このようなボタンをクリックするか、ブラウザで新しいタブを開くなどGUIベースの活動を記録することは、簡単に記録することができるものではありません
Sergiy Kolodyazhnyy

@Sergあなたが提案するログは確かに私が探しているものでしょう。GLI名ではなく、CLI名に基づく「タスクマネージャー」ログのようなもの。これは、既存の回答が示唆しているように、一致しない場合があります。たとえば、[設定]で[言語サポート]を開いた場合、対応するCLIについて知りたいのですが。その他...

@luchonachoわかりました。今日から書き始め、準備ができたら投稿します。ちなみに、設定の「Language Support」には、それに相当するcliはありません。ブルートゥースメニューやバックグラウンドメニューなど、いくつかのことを行います- unity-control-center backgroundまたはgnome-control-center background(デスクトップ、UnityまたはXFCEまたはGNOMEに応じて)指定できます。しかし、外の世界だけがおそらく見えるでしょうgnome-control-center
セルギー・コロディアズニー

GUIアプリケーションによってどのようなタスクが実行されているかを調べたり、それに相当するcliを調べたりするには、多くの方法があります。力ずくで起きるすべてを盲目的に記録しようとするのは、私には非常に非効率です。特定のツールを使用して、特定のケースでよりよく調べる。
Jacob Vlijm 2017年

回答:


2

前書き

すべての GUIアクションをログに記録することはできませんが、開いているウィンドウに対応するコマンドのロギングなどを実行できます。以下はその仕事をする簡単なpythonスクリプトです。それはまだ開発中ですが、必要なタスクの90%を実行します。

ソースコード

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gdk,Gtk
import time
import os
import subprocess

def run_cmd(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 print_info(stack,event):
    base_xprop = ['xprop','-notype']
    for xid in stack:
        pid = None
        check_pid = run_cmd(base_xprop + [ '_NET_WM_PID', '-id',str(xid)])
        if check_pid:
            pid = check_pid.decode().split('=')[1].strip()
        with open('/proc/'+pid+'/cmdline') as fd:
            command = fd.read()
        print(time.strftime("%D %H:%M:%S" + " "*3) + event + pid + " " + command)

def main():
    sc = Gdk.Screen.get_default()
    old_stack = None

    while True:
        stack = [ win.get_xid() for win in sc.get_window_stack() ]
        if old_stack:
            # Difference between current and old stack will show new programs
            diff = set(stack) - set(old_stack)
            if diff:
                print_info(diff," 'New window open' ")
        else:
            print_info(stack," 'Script Started' ")

        old_stack = stack
        time.sleep(2)

if __name__ == '__main__': main()

試運転:

$ ./log_open_windows.py                                                                                                
01/25/17 15:33:13    'Script Started' 2915 nautilus-n
01/25/17 15:33:13    'Script Started' 3408 /opt/google/chrome/chrome
01/25/17 15:33:13    'Script Started' 12540 /usr/bin/python/usr/bin/x-terminal-emulator
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:13    'Script Started' 2454 compiz
01/25/17 15:33:21    'New window open' 15143 /usr/lib/firefox/firefox-new-window
01/25/17 15:33:27    'New window open' 15196 unity-control-center

スクリプトには、タイムスタンプ、イベントタイプ、ウィンドウPID、および対応するコマンドが表示されます。

使い方

すべてのスクリプトの標準ルールが適用されます。スクリプトは必ず~/binディレクトリに保存してください。~/binディレクトリがない場合は、作成します。そこでスクリプトファイルを保存し、それがで実行可能であることを確認しchmod +x ~/bin/log_open_windows.pyます。その後、コマンドラインで呼び出すことにより、いつでもコマンドラインから実行できます~/log_open_windows.py


ありがとう。有望に見えます!2つの質問。それを実行するには?10%不足しているものは何ですか?

気の利いた!私から+1!
Fabby 2017年

@luchonacho使用法に関する段落を追加しました。私が説明したように、コマンドラインから手動で使用することをお勧めします。起動時に自動的に開始することもできますが、お勧めしません。不足している10%は、私が追加したかった他のいくつかの機能ですが、それらを追加するつもりはないと思います。今のところ十分に機能します。しかし、多分私は再び私の心を変えるつもりです
セルギーKolodyazhnyy

これはおそらく、私が探していたものに到達できる最も近いものです。完璧なソリューションは存在しないことを承知しています。ありがとう!

4

その種のログファイルを学習のベースとして提案することは、実際には素晴らしいアイデアです。

残念ながら、GUIプログラムの多くのアクションは、外部コマンドを使用せずにプログラム自体に実装されています。また、外部コマンドを使用する場合でも、シェルで行う場合とは異なる場合があります。
したがって、それは存在せず、実装も簡単ではありません。

しかし、私は問題の一部の解決策を持っています。GUIのプログラム名は、GUI名がローカル言語に翻訳されている場合だけでなく、シェルコマンドで知る必要があるプログラム名と異なる場合があります。

たとえばFiles、comman行でプログラムを開始する方法は?

*.desktop名前についてはすべてのファイルを調べる必要があります。そこで、次のExec行にコマンドが見つかります。

locate -b '.desktop' | xargs grep -ls '^Name.*=Files$' | xargs grep '^Exec.*'

は、GUIプログラムのデスクトップファイル名とコマンドの一覧です。File複数の単語であっても、検索対象の正確な名前に置き換えてください(部分文字列検索の場合は、=とを省略します$)。

コマンドを使用して、私の発見がFilesあることもnautilusdolphinあるいはactive-filebrowser

/etc/xdg/autostart/nautilus-autostart.desktop:Exec=nautilus -n
/usr/share/app-install/desktop/nemo:nemo.desktop:Exec=nemo %U
/usr/share/app-install/desktop/plasma-active:kde4__active-filebrowser.desktop:Exec=active-filebrowser -graphicssystem raster %u
/usr/share/applications/nautilus-folder-handler.desktop:Exec=nautilus %U
/usr/share/applications/nautilus.desktop:Exec=nautilus --new-window %U
/usr/share/applications/nautilus.desktop:Exec=nautilus --new-window

うーん、私の質問は、より複雑なlinuxのビューの根底にあり、より複雑なプログラムはより単純なコードに基づいて構築されているため、GUIアプリケーションはターミナルコマンドに依存していると思いましたが、ターミナルはソフトウェアではなくbashコードに基づいているため、そうではない可能性がありますpythonやc ++などで記述できます。私は間違っていますか?

複雑さの層は存在しますが、別の方法で存在します。実際には、システムコール、ライブラリー関数、さらにグラフィカルユーザーインターフェイスまたはコマンドラインインターフェイスがあり、それらは代替手段です。
Volker Siegel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.