先決條件 要充分理解本文,必須具備Windows 環境下桌面應用程序的工作經驗,我認為讀者對如何使用 Linux 桌面有一個基本的了解。使用一個運行的 Linux 計算來機探討本文的概念和示例是很有幫助的。
概述
有時候第一次在 Linux 上運行一個應用程序需要一點額外工作。有些應用程序,比如服務器服務,可能無法安裝為服務,因此您需要從命令行啟動這些應用程序。對于啟動這些應用程序的用戶帳戶而言,需要在應用程序文件中設置執行許可標志 (x)。
運行用戶空間應用程序
Linux 在內核空間或用戶空間運行進程。用戶空間 是操作系統的區域,應用程序通常在此運行。簡單地說,每個用戶帳戶有其自己的用戶空間,應用程序在這個領域內運行。
默認情況下,只有 root 用戶有權訪問內核空間。root 用戶 是 Linux 中的超級用戶,相當于 Windows 中的管理員帳戶。在 root 用戶帳戶下運行應用程序可能會引起安全風險,是不可取的。
很多服務器服務需要 root 權限啟動服務。然而,服務啟動后,root 帳戶通常會將其移至服務帳戶。嚴格地說,Linux 中的服務帳戶 才是標準的用戶帳戶。主要區別是服務帳戶僅用于運行一個服務,而不是為任何實際登錄的用戶準備的。
設置權限
您可以使用 chmod 命令在一個文件中設置執行權限。在 Linux 中,umask 設置通常用來防止下載的文件被執行,也有充分的理由相信,因為它有助于維護 Linux 計算機的安全性。
大多數 Linux 發行版具有一個值為 022 的 umask 設置,這意味著,默認情況下一個新文件權限設置為 644。權限的數字表示形式采用讀 (4)、寫 (2)、執行 (1) 的格式。因此,默認權限為 644 的應用程序下載意味著文件所有者有讀寫權限,而組用戶和其他用戶只有讀權限。
例如,為每個人賦予一個文件的執行權限,使用 chmod a+x 命令。a 表示所有人,加號 (+) 表示添加,而 x 表示執行。同樣地,如果應用程序是一個服務器服務,您應該確保只有授權帳戶才有權執行此服務。
如果一個應用程序能夠在標準用戶帳戶權限下運行,但只有特定組中的用戶才需要使用它,您可以將該組所有者權限設置為可執行,然后將這些用戶添加到該組中。
更具體地說,您可以在一個可執行文件中設置訪問控制列表 (ACL) 權限,賦予特定用戶或組權限來運行該應用程序。使用 setfacl 實用工具設置 ACL 權限。
對于這些需要以 root 用戶啟動進程的應用程序,比如服務器服務,您有幾個選擇。總結了允許用戶執行需要 root 權限的服務器服務的各種選項。
選項 | 描述 |
作為 root 用戶 | 不推薦用于服務器服務。當用戶已經知道 root 密碼而且應用程序泄露不是首要關注問題時,可用于應用程序。 |
SetUID | 由于安全問題,不推薦使用。SetUID 允許標準用戶以另一個用戶方式,比如 root 用戶,執行一個文件。 |
sudo | 很常用,并且被認為是一個很好的實踐。sudo 授予一個用戶或組成員權限以執行可能額外需要 root 權限的文件。該用戶不需要知道 root 密碼。 |
帶有文件權限的標準用戶帳戶 | 在一個文件上為用戶所有者、組所有者或其他人(所有人)設置執行權限。這是授予那些不需要 root 權限來執行應用程序的用戶的常用方法。 |
帶有 ACL 權限的標準用戶帳戶 | 使用較少,但是如果您不想授予一個用戶 sudo 訪問或者更改文件的權限,這也是一個可行的解決方案。在一個文件上使用 setfacl 命令,您可以授予一個特定用戶或用戶組執行該文件的權力。 |
從命令行運行
在管理 Linux 服務器時,從命令行運行應用程序是一項基本的任務。很多應用程序使用 shell 腳本(類似于 Windows 批處理文件 .bat)來啟動應用程序并執行其他任務,比如設置變量以及為其他用戶分配進程。例如,應用程序可能需要一個 Java? Virtual Machine (JVM) 來執行。那樣的話,shell 腳本可以設置適當的環境變量,然后執行 Java 命令來運行 Java Archive (JAR) 或類文件。這同樣適用于使用 Perl、Python、甚至 C# 的應用程序。(當然,C# 編譯的應用程序可以在 Linux 上運行)
從命令行或者 shell 提示符執行應用程序的一個常用方法是使用 ./ 命令。如果您在 Linux 中使用句號 (.) 和正斜杠 (/),就意味著告訴環境您想要以可執行文件運行該文件。例如,運行一個名為 myapp 的可執行文件,您可以使用 ./myapp 命令。同樣地,您可以在文件名之前加上語言環境,比如:
● sh
● php
● python
● perl
● java
但更多情況下,套裝應用程序使用 shell 腳本,以 #! 符號設置環境變量提供該語言的運行時可執行路徑,比如 #!/usr/bin/python。您也應該熟悉這種方法。
清單 1 使用 catalina.sh 默認腳本通過 ./ 方法啟動 Apache Tomcat 應用程序服務器。然后,使用 sh 方法啟動服務器。因為默認端口是 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 |
考慮啟動一個典型 Hypertext Transfer Protocol (HTTP) 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 服務器那樣用戶友好。您很可能需要在流程啟動后以后臺方式運行它,除非您正在進行故障排除,或者想要看看應用程序到底怎么了。如果您沒有這么 做,shell 關閉后應用程序將終止。運行服務器服務時,可不希望每次關閉終端 shell 或者退出時服務都會停止!
如果在后臺運行一個應用程序,即使關閉了 shell 窗口,應用程序也會繼續運行。您可以通過在執行命令結尾附加一個 (&) 符號來啟動應用程序。例如,您可以使用 vi 編輯器打開文件,然后使用 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 本機固有的,還有另外一些應用程序可能是在一個常用運行時環境中使用 C# 開發的跨平臺應用程序,比如,.NET Framework 應用程序。您會發現,使用一個 Wine 這樣的虛擬環境,您甚至可以在 Linux 上運行您最喜愛的 Windows 應用程序。
Linux 本機應用程序 您很有可能會為您最喜愛的基于 Windows 的應用程序找到一個替代的 Linux 應用程序。在桌面上運行 Linux 本機應用程序比較直觀。與 Windows 一樣,您通常可以在菜單中找到這些已組織的應用程序,當您想要一個 Windows 應用程序時,只需單擊并運行即可。
對于那些需要 root 權限的應用程序,將會提示您輸入 root 密碼,然后才開始運行。這在概念上類似于 Windows 中的 Run as Administrator 選項。否則,您運行的所有程序都會位于您所登錄帳戶的用戶空間中。
在 Windows 中,您可以創建桌面快捷鍵。Linux 也有類似的快捷鍵 launcher,您可以將它放在面板或桌面上。單擊 launcher 時,快捷鍵將執行程序。
圖 1 顯示 GNOME Desktop 上 Mozilla Firefox Web 瀏覽器的兩個 launcher。一個 launcher 位于面板上,另一個位于桌面上。
圖 1. 查看桌面或面板上的 launcher

Mono
許多 Windows 應用程序都是使用 .NET Framework 開發的。Mono 是 .NET 的一個開源實現,可在很多平臺上運行(包括 linux)。事實上,Mono 網站稱其為 C# 和 Common Language Runtime (CLR) 的一個實現,與 .Net 是二進制兼容的。此項目目前由 Xamarin 支持。
在 Linux 上,您可以執行使用 .NET framework(或 Mono)開發的應用程序,就像在 Windows 上一樣。但是,記住 Linux umask 和默認文件權限。您仍然需要提供文件的執行權限,這樣 Linux 才會允許執行可執行文件。
在 Mono(可以安裝在您的 Linux GNOME 桌面上)上開發的一些跨平臺應用程序,比如 F-Spot,同本機 GNOME 應用程序一同位于菜單中。F-Spot 是一個管理照片的開源應用程序。盡管它是 C# 應用程序,但是在 GNOME 桌面上表現為一個本機應用程序。為應用程序創建一個 launcher 后,就可以像在 Windows 中那樣單擊并運行。
圖 2 演示了基于 Mono 的應用程序 F-Spot 的位置,以及為其創建桌面或面板 launcher 的方法。
圖 2. 為 F-Spot 創建一個 launcher

Wine
Wine 使您可以在 Linux 和其他操作系統上運行 Windows 軟件。有了 Wine,您就可以像在 Windows 中那樣安裝和運行應用程序。Wine 仍然在積極的發展中,而且并不是所有的 Windows 程序都可以使用 Wine。如果您的應用程序是為 Windows 操作系統編譯的,您就會發現它可以使用 Wine 來充分運行,前題是它是一個桌面應用程序而不是一個服務器應用程序。一定要檢查 Wine 文檔關于在 Linux 上運行該應用程序的可行性,因為 Wine 并不完全支持所有的應用程序。
當您在 Linux 中使用 Wine 時,在您帳戶主目錄下有一個模擬 Windows 環境的隱藏文件夾,如 清單 4 所示。
清單 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 就可以在 Linux 桌面安裝 Windows 版本。與 Wine 相關的應用程序通常分組為 Applications > Wine > Programs,如 圖 3 所示。
圖 3. 使用 Wine 在 Linux 上運行一個 Windows 應用程序

結束語
在管理一個 Linux 服務器時,您肯定會遇到從桌面和命令行執行軟件的問題。了解如何設置適當的權限和用戶帳戶后,您就可以安全地運行這些應用程序。使用長期運行的進程,比如 服務器服務,您可以從命令行執行,并在后臺進行適當設置。如果您的應用程序適合于從桌面運行,也可以那樣做,有時候甚至可以是 Windows 應用程序!