ちょうど2日前にWindowsからUbuntu16.04に移行しました。 UnityDesktopをカスタマイズする方法が気に入っています。デスクトップ環境のルックアンドフィールをいじっているだけです。 Windowsと同じように、ランチャーを画面の下部に配置したかったのです。グーグルで、次のようなコマンドを見つけました:
gsettings set com.canonical.Unity.Launcher launcher-position Bottom
また、作業を完了するためのunity-tweak-toolとdconfエディターがあります。しかし、これらは物事を成し遂げるためのGUIアプローチです。
私の質問は次のとおりです:
- これらのGUIベースのアプリケーションもバックグラウンドで同じコマンドを実行しますか?
- これらのアプリケーションの内部動作を確認するにはどうすればよいですか?つまり、ボタンをクリックするたびに実行されているコマンドを実際に確認する方法はありますか?
- これらのアプリケーションはバックグラウンドで端末を開き、これらのコマンドを実行しますか?
ここでの答えは、プロセスの標準ファイル記述子を取得する方法を示しています。しかし、出力には何も表示されませんでした。
さらに、strace -p pid -o output.txt
コマンドは大量のテキストをファイルにスローします。
つまり、GUIアプリケーションを使用して、コマンドラインから操作するのと同じことを実行しているのでしょうか。
承認された回答:
これらのGUIベースのアプリケーションもバックグラウンドで同じコマンドを実行しますか?
はいといいえ。彼らはdconf
に書き込みます 設定のデータベースですが、さまざまな方法で設定されている可能性があります。 Pythonで記述されたプログラムは、おそらくgi.repository.Gio
を使用します。 モジュール(私はそれを頻繁に使用するので知っています)または代わりにgsettings
を使用できます subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
を呼び出して外部コマンドとして 、基本的にはシェルコマンドとして実行されます。 Cプログラムは、似たようなもの、おそらくgio.h
を使用します ライブラリ、またはexec()
を使用することもできます Popen
と同じことを行う関数のファミリー Pythonで行います。それで、あなたのタイトルの質問に答えるために:「GUIベースのアプリケーションはバックグラウンドでシェルコマンドを実行しますか?」可能ですが、アプリが記述されている言語に対応するライブラリがあるため、必要ではない可能性があります。また、新しいプロセスを生成するよりも、ライブラリ関数を使用する方が少し速いでしょう。
ライブラリ/モジュールでどのように行われるかのサンプルを提供するために、ランチャーリストインジケーターのソースコードを自由に見てください。そこで、Gio.Settings
のインスタンスを作成する関数を作成しました。 クラスを作成し、それを使用して、必要なリストのタイプに応じてUnityランチャーを変更します。
これらのアプリケーションの内部動作をのぞき見する方法は?つまり、ボタンをクリックするたびに実行されているコマンドを実際に確認する方法はありますか?
いいえ。ボタンを押すかウィンドウ要素をクリックしたときに、そのアプリのプログラミング言語でどのコマンドが発行されるかを確認したい場合は、それは不可能です。入手可能な場合は、アプリケーションのソースコードをお読みください。 dconf watch /
を使用できます 変更されている設定を確認しますが、どのように変更されているかは確認しません。
技術的には、デバッガーの操作方法、メモリアドレスの読み取り方法、およびアセンブリ言語を知っている場合は、CPUおよびメモリレベルでアプリが何を実行するかを知ることができます。これはソフトウェアリバースエンジニアリングと呼ばれ、セキュリティの専門家が悪意のあるソフトウェアを分析し、正当なソフトウェアの脆弱性を発見するために頻繁に使用されます。
これらのアプリケーションはバックグラウンドで端末を開き、これらのコマンドを実行しますか?
いいえ、端末は接続されていません。多くのプログラムは、dconf
がどこにあるかを知っています ユーザーのデータベースがあり、そこに書き込みます。 dbus
と呼ばれるプロセス間通信バスもあります 、プログラムは信号を送信でき、プログラムは「ねえ、それは私へのメッセージです!」のようになります。
補遺
-
アプリケーションは他のアプリケーションを実行できますか?はい、それは標準の
fork()
を介して行われます およびexecve()
システムコール。 Linuxおよびその他の*nixシステムでプロセスを作成する本質は、主にこれら2つに基づいています。非組み込みコマンドを実行するためのシェルメカニズムは、特にそれを頻繁に使用します。インタラクティブに実行する場合$ ls
シェルは
fork()
を介して新しいプロセスを作成します 、そのプロセスはexecve()
を実行しますls
を開始します 。execve()
のせいで その新しいフォークされたプロセスはls
になります 。pipe()
システムコールは、ls
の出力を読み戻すのに役立ちます 。パイプメカニズムがどのように機能するかを理解するために、パイプとリダイレクトの違いは何ですか?それは|
だけではありません。 演算子ですが、実際にはシステムコールです。 -
アプリケーションはシェルコマンドを実行できますか?いいえ。シェルの構文は、シェル自体によってのみ理解されます。ただし、できることは、コマンドライン
-c
でシェルを開始することです。 切り替えて、適切なコマンドを提供します。カスタムショートカットは実行可能ファイルで動作し、構文を理解するためのシェルがないため、これはGNOMEまたは他のデスクトップ環境で設定されたカスタムショートカットによく使用されます。したがって、例として、bash -c 'xdotool key Ctrl+Alt+T'
を実行します。xdotool
を間接的に実行する コマンドまたはbash -c 'cd $HOME/Desktop; touch New_File'
をタッチします ショートカットを使用してデスクトップに新しいファイルを作成します。シェルを明示的に使用しているため、シェル変数を使用できるため、これは特に興味深い例です。