Windows システム管理者のための Linux: Linux 上で動作するアプリケーションの実行方法を理解する

Linux アプリケーションをコマンドラインおよびデスクトップの両方から実行する

アプリケーションを使用することは、Linux サーバーの第一の目的です。新しくインストールしたアプリケーションをデスクトップまたはコマンドラインのどちらから実行するにしても、Microsoft Windows の経験を生かして Linux でアプリケーションを実行する方法を素早く理解するには、この記事が参考になります。

2012年 5月 17日 ― 著者は読者からのコメントに対応して、「コマンドラインから実行する」セクションの 2 番目の段落の内容を変更するとともに、「すべて相対パスで行う」という囲み記事を追加しました。

Tracy Bost, Consultant and Trainer, Freelance

Author photo - Tracy BostTracy Bost は、経験豊かなソフトウェア開発者兼システム・エンジニアです。彼は Linux オペレーティング・システムの講師およびトレーナーも務めています。RHCE (Red Hat Certified Engineer) および MCSE (Microsoft Certified Systems Engineer) の認定を両方とも取得し、Linux Foundation の活発なメンバーでもあります。貸付産業、不動産、非営利セクターなどの業界に従事してきました。



2012年 5月 31日

前提条件

この記事を最大限に利用するには、Windows 環境でデスクトップ・アプリケーションを扱った経験が必要です。記事では、読者の皆さんが Linux デスクトップの基本的な使い方を理解していることを前提とします。記事で説明する概念とサンプルを調べるために実際に使用できる Linux コンピューターがあると便利です。


概要

この連載のその他の記事

連載「Windows システム管理者のための Linux」のその他の記事を閲覧してください。

Linux でアプリケーションを初めて実行するときには、多少の追加作業が必要になることがあります。サーバー・サービスなど、アプリケーションのなかにはサービスとしてインストールされるものがありますが、そのようなアプリケーションについてはコマンドラインから起動しなければなりません。その場合、アプリケーションを起動するユーザー・アカウントには、アプリケーション・ファイルの実行権限フラグ (x) をセットしてください。


ユーザー空間のアプリケーションを実行する

Linux は、プロセスをカーネル空間またはユーザー空間のいずれかで実行します。ユーザー空間とは、アプリケーションが通常実行されるオペレーティング・システムの領域です。簡単に言うと、各ユーザー・アカウントには独自のユーザー空間があり、アプリケーションはその領域内で機能します。

カーネル空間には、デフォルトでは root ユーザーしかアクセスすることができません。Linux での root ユーザーは、スーパーユーザーです。スーパーユーザーは、Windows での管理者アカウントに相当します。root ユーザー・アカウントでアプリケーションを実行すると、セキュリティーのリスクが生じるおそれがあるため、推奨されません。

サーバー・サービスを開始するには、多くの場合、root 権限が必要です。ただし、サービスが開始された後、root は一般にそのサービスをサービス・アカウントに引き渡します。Linux でのサービス・アカウントは、技術的には標準ユーザー・アカウントと同じですが、標準ユーザー・アカウントとの主な違いは、サービス・アカウントはサービスを実行する場合にのみ使用され、ユーザーが実際にログインする際に使用するようには作られていないことです。


パーミッションを設定する

ファイルに実行権限を設定するには、chmod コマンドを使用します。通常、Linux では umask の設定によって、ダウンロードされたファイルを実行できないようにしますが、これには Linux コンピューターのセキュリティーを維持する上で有効であるため、という妥当な理由もあります。

ほとんどの Linux ディストリビューションでは、umask022 に設定されます。これはデフォルトで、新規ファイルのパーミッションが 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 コマンドを実行することにより、特定のユーザーまたはユーザーのグループに、ファイルの実行権限を付与することができます。

コマンドラインから実行する

標準ユーザー・アカウントと root 権限のコマンド

この記事のリストに記載されている各コマンドが、ドル記号 ($) またはハッシュ記号 (#) のいずれかで始まっていることに注目してください。Linux シェルでは、これらの記号に意味があります。シェル・プロンプトでの $ は、ユーザーが標準アカウントの権限を持つことを意味し、# は root (管理者) 権限を持つことを意味します。リストに記載されている # で始まるコマンドを実行するには、sudo によって root 権限を利用するか、root アカウントを直接利用してコマンドを実行する必要があります。

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 にドット (.) を含めればよいことを知っているシステム管理者もいますが、セキュリティー上の理由からこれを実践するのは推奨されません)。さらに、ファイル名の前に以下のような言語環境を挿入することもできます。

すべて相対パスで行う

DOS のときから、ユーザーはカレント作業ディレクトリーに対する相対パス名を指定することができました。ドット (.) はカレント・ディレクトリーを意味しており、2 つのドット (..) は 1 つ上のディレクトリーを意味しています。従って、作業しているディレクトリーが /home/myuser/docs で、/home/myuser/bin にあるファイルやディレクトリーにアクセスしたい場合には、「../bin」とします。スクリプトやそれ以外のファイルを格納するディレクトリー構造を作成したものの、その最終的なインストール場所がどこになるのかわからないような状況でスクリプトを作成する場合には、相対パス名を指定する方法が非常に役に立ちます。

  • 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. デスクトップ上とパネル上のランチャーの表示
コンピューター、Firefox、tbost のホームの各アイコンを示すスクリーン・キャプチャー

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 アプリケーションを実行する
Wine を使用して Linux 上で実行する Windows アプリケーションを示すスクリーン・キャプチャー

まとめ

この連載のその他の記事

連載「Windows システム管理者のための Linux」のその他の記事を閲覧してください。

Linux サーバーを管理する際には例外なく、デスクトップやコマンドラインから実行するソフトウェアを扱うことになるはずです。適切なパーミッションとユーザー・アカウントを設定する方法を理解していれば、これらのアプリケーションを安全に実行することができます。サーバー・サービスなどの長時間実行されるプロセスは、コマンドラインから実行し、必要に応じてバックグラウンド・プロセスとして設定することができます。デスクトップから実行されるように意図されているアプリケーションについても同様のことが可能であり、場合によってはそれが Windows アプリケーションであっても同様のことが可能です。

参考文献

学ぶために

製品や技術を入手するために

  • Wine プロジェクトの Web サイトで、Wine を使用して Windows アプリケーションを Linux 上で実行する方法を詳しく学んでください。
  • Mono プロジェクトの Web サイトで、Mono を使って .NET Framework アプリケーションを Linux 上で実行する方法を学んでください。
  • IBM 試用版ソフトウェアを使用して、開発者専用のソフトウェアを使って次のオープンソース開発プロジェクトを革新してください。IBM 試用版ソフトウェアは、ダウンロードまたは DVD で入手できます。

議論するために

  • developerWorks コミュニティーに参加して、他の developerWorks ユーザーとのつながりを持ち、開発者によるブログ、フォーラム、グループ、ウィキを調べてください。developerWorks コミュニティーで、Real world open source グループの構築を手伝ってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=818626
ArticleTitle=Windows システム管理者のための Linux: Linux 上で動作するアプリケーションの実行方法を理解する
publish-date=05312012