GNU/Linux >> Linux の 問題 >  >> Ubuntu

GUIベースのアプリケーションはバックグラウンドでシェルコマンドを実行しますか?

ちょうど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 /を使用できます 変更されている設定を確認しますが、どのように変更されているかは確認しません。

関連:ブート修復を使用してUbuntuをインストールした後、Windows 8はGRUB経由で起動しませんか?

技術的には、デバッガーの操作方法、メモリアドレスの読み取り方法、およびアセンブリ言語を知っている場合は、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'をタッチします ショートカットを使用してデスクトップに新しいファイルを作成します。シェルを明示的に使用しているため、シェル変数を使用できるため、これは特に興味深い例です。


Ubuntu
  1. .desktopファイル。アプリケーションの起動中にエラーが発生しましたか?

  2. バックグラウンドで UNIX / Linux コマンド (およびシェル スクリプト) を実行する 5 つの方法

  3. Linux のジョブ制御コマンドを理解する – bg、fg、および CTRL+Z

  1. 非同期シェル コマンド

  2. シェル コマンドのソース コードを読むにはどうすればよいですか?

  3. リモート マシンに ssh するためのシェル スクリプトを記述し、コマンドを実行する

  1. バックグラウンドでシェルスクリプトを実行する方法は?

  2. ユーザーが選択的なコマンドを実行できるように制限する (Linux)

  3. Linux でシェル アプリケーションの出力を非表示にするにはどうすればよいですか?