Windows システム管理者のための Linux
Linux 上で動作するアプリケーションの実行方法を理解する
Linux アプリケーションをコマンドラインおよびデスクトップの両方から実行する
コンテンツシリーズ
このコンテンツは全#シリーズのパート#です: Windows システム管理者のための Linux
このコンテンツはシリーズの一部分です:Windows システム管理者のための Linux
このシリーズの続きに乞うご期待。
前提条件
この記事を最大限に利用するには、Windows 環境でデスクトップ・アプリケーションを扱った経験が必要です。記事では、読者の皆さんが Linux デスクトップの基本的な使い方を理解していることを前提とします。記事で説明する概念とサンプルを調べるために実際に使用できる Linux コンピューターがあると便利です。
概要
Linux
でアプリケーションを初めて実行するときには、多少の追加作業が必要になることがあります。サーバー・サービスなど、アプリケーションのなかにはサービスとしてインストールされるものがありますが、そのようなアプリケーションについてはコマンドラインから起動しなければなりません。その場合、アプリケーションを起動するユーザー・アカウントには、アプリケーション・ファイルの実行権限フラグ
(x
) をセットしてください。
ユーザー空間のアプリケーションを実行する
Linux は、プロセスをカーネル空間またはユーザー空間のいずれかで実行します。ユーザー空間とは、アプリケーションが通常実行されるオペレーティング・システムの領域です。簡単に言うと、各ユーザー・アカウントには独自のユーザー空間があり、アプリケーションはその領域内で機能します。
カーネル空間には、デフォルトでは root ユーザーしかアクセスすることができません。Linux での root ユーザーは、スーパーユーザーです。スーパーユーザーは、Windows での管理者アカウントに相当します。root ユーザー・アカウントでアプリケーションを実行すると、セキュリティーのリスクが生じるおそれがあるため、推奨されません。
サーバー・サービスを開始するには、多くの場合、root 権限が必要です。ただし、サービスが開始された後、root は一般にそのサービスをサービス・アカウントに引き渡します。Linux でのサービス・アカウントは、技術的には標準ユーザー・アカウントと同じですが、標準ユーザー・アカウントとの主な違いは、サービス・アカウントはサービスを実行する場合にのみ使用され、ユーザーが実際にログインする際に使用するようには作られていないことです。
パーミッションを設定する
ファイルに実行権限を設定するには、chmod
コマンドを使用します。通常、Linux では umask
の設定によって、ダウンロードされたファイルを実行できないようにしますが、これには Linux コンピューターのセキュリティーを維持する上で有効であるため、という妥当な理由もあります。
ほとんどの Linux ディストリビューションでは、umask
は 022
に設定されます。これはデフォルトで、新規ファイルのパーミッションが 644
に設定されることを意味します。パーミッションの数値表現は、読み取り (4)、書き込み (2)、実行 (1) という形をとります。したがって、パーミッションがデフォルトの
644
に設定されたアプリケーションのダウンロードでは、ファイル所有者に読み取りと書き込みが許可され、グループ所有者とその他のユーザーには読み取りのみが許可されます。
例えば、ユーザー全員にファイルの実行権限を与えるには、chmod a+x
コマンドを使用します。a
は「全員 (all)」を表し、プラス記号 (+
) は「追加」を、そして
x
は「実行 (execute)」を表します。同様に、アプリケーションがサーバー・サービスである場合には、許可されたアカウントだけにサービスの実行権限が与えられるようにしてください。
標準ユーザー・アカウントの権限で実行できるアプリケーションを、特定のグループに属するユーザーだけが使用できるように制限するには、グループ所有者に実行権限を設定して、該当するユーザーをグループに追加します。
さらに細かい設定になると、実行可能ファイルにアクセス制御リスト (ACL)
によるパーミッションを設定することで、特定のユーザーまたはグループにアプリケーションの実行権限を与えることもできます。ACL によるパーミッションを設定するには、setfacl
ユーティリティーを使用します。
root ユーザーとしてプロセスを開始しなければならないアプリケーション (サーバー・サービスなど) を実行するには、いくつかの方法があります。表 1 に、root 権限が必要なサーバー・サービスの実行をユーザーに許可するためのさまざまな方法を要約します。
表 1. root 権限が必要なアプリケーションを実行するための方法
方法 | 説明 |
---|---|
root ユーザーとして実行 | サーバー・サービスには推奨されません。ユーザーがアプリケーションの root パスワードを知っていて、アプリケーションのセキュリティー侵害が重要な懸念でない場合には許容されます。 |
SetUID を使用 | セキュリティー上の問題により、推奨されません。SetUID は、標準ユーザーが別のユーザー (例えば root) としてファイルを実行するために使用することができます。 |
sudo を使用 | 一般的に使用されていて、適切なプラクティスであると考えられます。sudo はユーザーまたはグループのメンバーに、root 権限がなければ実行できないファイルの実行権限を付与します。ユーザーが root パスワードを知っている必要はありません。 |
ファイルのパーミッションを指定することで標準ユーザー・アカウントのまま実行 | ユーザー所有者、グループ所有者、またはその他 (全員) の実行権限をファイルに設定します。root 権限を必要としないユーザーにアプリケーションを実行する権限を付与するには、これが一般的な方法です。 |
ACL によるパーミッションを指定することで標準ユーザー・アカウントのまま実行 | それほど一般的には使用されていませんが、sudo
によるアクセス権をユーザーに付与したくない場合、またはファイルのパーミッションを変更したくない場合に使用できるソリューションです。ファイルで setfacl コマンドを実行することにより、特定のユーザーまたはユーザーのグループに、ファイルの実行権限を付与することができます。 |
コマンドラインから実行する
Linux サーバーを管理するときには、必ずコマンドラインからアプリケーションを実行する必要があります。多くのアプリケーションには、Windows のバッチ・ファイル (.bat) に相当するシェル・スクリプトがあり、これらのスクリプトがアプリケーションを起動して、変数を設定したり、プロセスを他のユーザーに割り当てたりするなどのタスクを実行します。例えば、JVM (Java Virtual Machine) が実行されていることが前提条件となるアプリケーションがあるとします。その場合、シェル・スクリプトで、適切な環境変数を設定してから、JAR (Java Archive) やクラス・ファイルなどを実行する Java コマンドを実行することができます。これは、Perl、Python、さらには C# を使用するアプリケーションにも当てはまります (そうです。C# でコンパイルされたアプリケーションも、Linux で実行できるということです)。
コマンドがシェルの組み込みコマンドである場合や、コマンドが置かれているディレクトリーが PATH
変数に含まれている場合には、コマンドラインやシェル・プロンプトからファイル名のみを指定してコマンドを実行することができます。ls や cd といったコマンドは、通常は
/usr/local/bin または /usr/bin などのディレクトリーに置かれており、デフォルトで PATH に含まれていることが一般的です。しかしファイルの場所が
PATH に設定されていない場合には、実行するコマンドのファイル名にパス名を含める必要があります。例えば、実行可能なファイルである myapp が
/usr/share/scripts ディレクトリーにある場合には、「/usr/share/scripts/myapp
」と入力することで myapp スクリプトを実行します。ファイル名の前にドット (.) とスラッシュ (/) を追加して「./myapp
」と入力することで、相対パスを使用することもできます。シェルにおけるドット (.) は「カレント・ディレクトリー」を指しています (Windows の場合、実行パスに作業ディレクトリーが含まれており、これをエミュレートするには PATH にドット (.) を含めればよいことを知っているシステム管理者もいますが、セキュリティー上の理由からこれを実践するのは推奨されません)。さらに、ファイル名の前に以下のような言語環境を挿入することもできます。
- sh
- php
- python
- perl
- java
ただし、パッケージ化されたアプリケーションで ./ の手法よりも多く使用されているのは、シェル・スクリプトで環境変数を設定し、#!
記号を使って言語の実行可能ファイルのパス (例えば、#!/usr/bin/python
) を指定するという手法です。この手法にも慣れておいてください。
リスト 1 に、最初に ./
の手法、次に sh
の手法で、catalina.sh
デフォルト・スクリプトを使用して Apache Tomcat
アプリケーション・サーバーを起動する例を記載します。デフォルト・ポートは 8080 なので、標準ユーザーとしてサービスを開始するために必要な変更は特にありません。
リスト 1. コマンドラインからアプリケーションを実行する
$ ./catalina.sh start Using CATALINA_BASE: /opt/apache-tomcat-7.0.26 Using CATALINA_HOME: /opt/apache-tomcat-7.0.26 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.26/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.26/bin/bootstrap.jar: /opt/apache-tomcat-7.0.26/bin/tomcat-juli.jar $ ./catalina.sh stop ..................................................................... $ sh catalina.sh start Using CATALINA_BASE: /opt/apache-tomcat-7.0.26 Using CATALINA_HOME: /opt/apache-tomcat-7.0.26 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.26/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.26/bin/bootstrap.jar: /opt/apache-tomcat-7.0.26/bin/tomcat-juli.jar
一般的な HTTP (HyperText Transfer Protoco) Web サーバーを起動する場合を考えてみてください。Linux では、1024 よりも番号が小さいポートは「特権ポート」と見なされます。特権ポートを開けるのは、root のみです。Web サーバーはデフォルトではポート 80 で動作するため、root がプロセスを開始する必要がありますが、上述のとおり、サービスを root ユーザーとして実行するのは安全ではありません。サービスを root として開始した後、そのサービスを標準ユーザー・アカウントまたはサービス・アカウントに引き渡すことが、正しい手順となります。
幸い、多くのサーバー・サービスには、まさにこの正しい手順を行うスクリプトが用意されています。Apache Web サーバーをソースからビルドすると、サービスが root
として開始された後、httpd スレッドが apache
ユーザーに渡されることがわかります。
リスト 2 のように実行すると、Apache 2 Web サーバーのデフォルト・コンパイルが開始されます。インストール・プロセスでは、apachectl
コマンドを実行可能にすることを含め、いくつかの処理が行われます。このプロセスにはポート 80
を使用する必要があるため、プロセスは root ユーザー権限で開始されますが、ps
コマンドを実行すると、httpd プロセスが apache ユーザー・アカウントで実行されていることが明らかになります。
リスト 2. Apache Web サーバーを起動する
# cd /usr/local/apache2/bin # apachectl start #ps aux | grep httpd apache 23094 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23095 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23096 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23097 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23098 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start
アプリケーションをバックグラウンドで実行する
インストールされているソフトウェアには、Apache Web サーバーほどユーザー・フレンドリーではないものもあります。トラブルシューティングを行う場合や、アプリケーションで何が行われているのかを正確に把握したいのでない限り、プロセスが開始された後はアプリケーションをバックグラウンドで実行したいと思うことでしょう。アプリケーションがバックグラウンドで実行されていない場合、そのアプリケーションはシェルを閉じた時点で終了します。サーバー・サービスの実行中は、ターミナル・シェルを閉じたり、ログアウトしたりするたびにサービスが停止するのは好ましい動作ではありません。
バックグラウンドでアプリケーションを実行すれば、シェル・ウィンドウを閉じてもアプリケーションは引き続き実行されます。アプリケーションをバックグラウンドで開始するには、実行コマンドの最後にアンパサンド
(&
) を追加します。例えば、vi
/etc/sysconfig/network &
コマンドを実行すると、バックグラウンドで vi エディターを起動して
/etc/sysconfig/network ファイルを開くことができます (&
を指定することで、/etc/sysconfig/network ファイルはバックグラウンドで開かれ、そのままバックグラウンドで維持されます)。nohup
ユーティリティーを使用すれば、ログアウトした後でさえもプロセスが続行されるようにすることができます。したがって、この例の場合には、nohup vi /etc/sysconfig/network &
を実行することになります。
リスト 3 は、ファイルを編集するために Vim エディターで開いて、バックグラウンドで実行する例です。
リスト 3. アプリケーションをバックグラウンドで実行する
# vi /etc/sysconfig/network & [1] 24940 # jobs [1]+ Stopped vi /etc/sysconfig/network
jobs
コマンドを入力すると、バックグラウンドで実行中のすべてのアプリケーションを確認することができます。バックグラウンドで実行されるジョブのそれぞれには、1
から順に連番が割り当てられます。リスト 3 のジョブには、ジョブ番号 1 が割り当てられています。24940 はプロセス ID (PID)
です。アプリケーションをフォアグラウンドに移すには、fg
コマンドと、アプリケーションに固有のジョブ番号を使用します。上記の例のプロセスは、ユーザーによって使用されていないために Stopped
として示されていますが、fg 1
コマンドによって、ターミナルで再びファイルを編集するためのアクティブなプロセスが開きます。
デスクトップからアプリケーションを実行する
Linux でデスクトップからグラフィカル・ユーザー・インターフェース (GUI) アプリケーションを実行するのは、Windows での場合と大して変わりません。お使いのデスクトップ環境で、アプリケーションがどのようにメニューにグループ化されているかを理解していれば、ほとんどのところ十分です。Linux には、さまざまなタスクに利用できる多数のデスクトップ・アプリケーションがあります。これらのデスクトップ・アプリケーションには、Linux にネイティブなものもあれば、.NET Framework アプリケーションと同じように、共通ランタイム環境を使用する C# で開発されたクロスプラットフォーム・アプリケーションもあります。さらに、Wine のような仮想環境を使って、お気に入りの Windows アプリケーションを Linux 上で実行することもできます。
ネイティブ Linux アプリケーション
Windows ベースのお気に入りのアプリケーションに、Linux 版がある可能性は大いに考えられます。ネイティブ Linux アプリケーションをデスクトップで実行するのはごく簡単です。Windows と同じように、通常はネイティブ Linux アプリケーションもメニューに組み込まれるので、Windows アプリケーションと同じくクリックするだけで実行することができます。
root 権限が必要なアプリケーションの場合、アプリケーションを続行する条件として root パスワードの入力を求めるプロンプトが出されます。これは、概念としては Windows での「管理者として実行」オプションと同じです。root 権限が必要ないアプリケーションのすべては、ログインしたアカウントのユーザー空間で実行されます。
Windows では、ユーザーがデスクトップにショートカットを作成することができます。Linux にも、ランチャーと呼ばれる同様のショートカットがあり、パネルまたはデスクトップ上に配置することができます。ランチャーをクリックすると、該当するプログラムが実行されます。
図 1 に示す GNOME デスクトップ上には、Mozilla Firefox Web ブラウザーの 2 つのランチャーがあります。一方のランチャーはパネル上にあり、もう一方はデスクトップ上にあります。
図 1. デスクトップ上とパネル上のランチャーの表示

Mono
Windows アプリケーションの多くは、.NET Framework を使用して開発されています。Mono は .NET のオープンソース実装であり、Linux をはじめとする多くのプラットフォーム上で実行されます。実際、Mono の Webサイトでは Mono を、C# と .NET 対応のバイナリーである CLR (共通言語ランタイム) の実装であると説明しています。このプロジェクトは現在、Xamarin によってサポートされています。
.NET Framework (したがって、Mono) で開発されたアプリケーションを Linux 上で実行する方法は、Windows での場合と同じです。ただし、Linux
の umask
とデフォルトのファイル・パーミッションには注意してください。Linux で実行可能ファイルを実行するには、ファイルに実行権限を設定する必要があることに変わりはありません。
Mono で開発されて、Linux GNOME デスクトップにインストール可能なクロスプラットフォーム・アプリケーションのなかには、ネイティブ GNOME アプリケーションと一緒にメニューに組み込まれるものがあります。F-Spot はその一例です。写真を管理するためのオープンソース・アプリケーションである F-Spot は、C# アプリケーションではあるものの、GNOME デスクトップにはネイティブ・アプリケーションとして表示されます。アプリケーションのランチャーを作成した後は、Windows での場合とまったく同じように、ランチャーをクリックするだけでアプリケーションを実行できるようになります。
図 2 に、Mono ベースのアプリケーションである F-Spot の場所と、デスクトップまたはパネルにこのアプリケーションのランチャーを作成する方法を示します。
図 2. F-Spot のランチャーを作成する

Wine
Wine は、Windows ソフトウェアを Linux やその他のオペレーティング・システム上で実行するためのツールです。Wine を使用すれば、Windows でアプリケーションをインストールして実行する場合と同じように、Windows アプリケーションをインストール、実行することができます。Wine は今でも活発に開発が進められている段階にあり、すべての Windows プログラムが Wine で有効に機能するわけではありません。アプリケーションが Windows オペレーティング・システム用にコンパイルされていて、Wine で問題なく実行できる場合、そのアプリケーションはおそらくサーバー・アプリケーションではなく、デスクトップ・アプリケーションです。Wine はすべてのアプリケーションを完全にサポートしているわけではないので、特定のアプリケーションを Linux で実行できるかどうかについては、必ず Wine のドキュメントを調べてください。
Linux で Wine を使用する場合には、アカウントのホーム・ディレクトリーに隠しフォルダーが置かれます。このフォルダーが、リスト 4 に示すように Windows 環境をエミュレートします。
リスト 4. Windows 環境をエミュレートする Wine の隠しフォルダー
$ cd /home/tbost/.wine/drive_c/windows $ls cf8e.tmp command explorer.exe Fonts help hh.exe inf Installer ls.txt Microsoft.NET notepad.exe pwd.txt regedit.exe rundll.exe system system32 system.ini temp twain_32.dll twain.dll winhelp.exe winhlp32.exe win.ini winsxs
Wine を使用してアプリケーションをインストールすると、通常はデスクトップ・メニューにアプリケーションが表示されます。アプリケーションの実行方法は、Windows で実行する場合と同じです。
例えば、Camstudio は画面を動画に録画してその動画を管理するためのオープンソース・ツールです。現時点では、Linux オペレーティング・システム向けのリリースはありませんが、私は Wine を使用して Windows 版を Linux デスクトップにインストールしました。Wine 関連のアプリケーションは一般に、「Applications (アプリケーション)」 > 「Wine」 > 「Programs (プログラム)」に分類されます (図 3 を参照)。
図 3. Wine を使用して Linux 上で Windows アプリケーションを実行する

まとめ
Linux サーバーを管理する際には例外なく、デスクトップやコマンドラインから実行するソフトウェアを扱うことになるはずです。適切なパーミッションとユーザー・アカウントを設定する方法を理解していれば、これらのアプリケーションを安全に実行することができます。サーバー・サービスなどの長時間実行されるプロセスは、コマンドラインから実行し、必要に応じてバックグラウンド・プロセスとして設定することができます。デスクトップから実行されるように意図されているアプリケーションについても同様のことが可能であり、場合によってはそれが Windows アプリケーションであっても同様のことが可能です。
ダウンロード可能なリソース
関連トピック
- 「Windows から Linux へのロードマップ: 第 9 回 ソフトウェアのインストール」(Chris Walden 著、developerWorks、2003年11月) を読んで、Linux にソフトウェアをインストールする方法について詳しく学んでください。
- DOS と Linux のコマンドの違いを詳細に学んでください。
- developerWorks Linux ゾーンで、Linux 開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。
- オープンソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。
- developerWorks ポッドキャストで、ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
- Twitter で developerWorks をフォローしてください。
- Wine プロジェクトの Web サイトで、Wine を使用して Windows アプリケーションを Linux 上で実行する方法を詳しく学んでください。
- Mono プロジェクトの Web サイトで、Mono を使って .NET Framework アプリケーションを Linux 上で実行する方法を学んでください。