了解如何执行在Linux上运行的应用程序

先决条件

  要充分理解本文,必须具备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 应用程序!

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-23 09:15:04

了解如何执行在Linux上运行的应用程序的相关文章

Shashlik:Linux 上运行 Android 应用的新法子

Shashlik 是一个在通常的 GNU/Linux 发行版上加载 Android 应用的 "Android 模拟环境". Shashlik 将于7月晚些在 KDE Akademy 2015 大会上以 "一个在 '真正' Linux 上运行 Android 应用的新法子" 提到. 来自 Dan Leinir Turthra Jensen 的情报 : "Shashlik,一个尽可能小的 Android 系统和框架的集合,构建且运行于标准的.现代的 linux

嵌入式linux-Zedboard板子运行linaro linux后运行简单的程序出错

问题描述 Zedboard板子运行linaro linux后运行简单的程序出错 操作系统已经运行起来了,可以实现如ls,rm,mkdir等基本功能.我在虚拟机上用交叉编译器编译了只有一个简单的printf输出的程序,但是之后放到板子上运行时,没有报错,但是也没有看到printf运行的结果.请问是什么问题呢?

c++-各位大虾, 我想在程序里监视系统上运行的某些程序运行过程中是否报错异常,能实现吗? 怎么实现?

问题描述 各位大虾, 我想在程序里监视系统上运行的某些程序运行过程中是否报错异常,能实现吗? 怎么实现? 对于程序运行过程中卡死已经能检测,但是对于一些弹框类的运行出错却不知道怎么检测,请各位大虾指点迷津; 现在没有C币,如果回答是我想要的,我花钱补上 解决方案 这不就是编写一个华医生么(注:华医生是微软系统上负责处理应用程序崩溃的程序,就是你图上的"xxx已停止工作,Windows正在联机查找解决方案"),这是一个应用程序,是在用户模式下实现的,而并非在内核中实现,其实华医生也可以卸

c c++-现在Linux上的C/C++程序开发的就业前景如何?

问题描述 现在Linux上的C/C++程序开发的就业前景如何? 请有心人,详细讲下现!在Linux上的C/C++程序开发的就业前景如何?马上要毕业的本科生,出来在各个地区的工资状况如何?....谢谢 解决方案 毕业生就业,第一次选择至关重要.关系到未来的前途,因为是毕业生嘛!是新手,公司都会择优选,淘汰率很高的,你要是被公司放弃了.就没毕业生的优势了.所以尽力找中等的公司,寻找离家近的.心里心里有依靠 解决方案二: 语言不重要,思想才是王道.

在Linux操作系统上运行Windows应用程序_unix linux

大多使用Linux的人都对WINE程序比较熟悉,WINE程序是可以在不需要Windows的情况下使用Windows的软件.WINE还是算比较成熟的,但是WINE只能运行部分程序,还有一些程序在运行的时候会出现一些问题.  除了WINE,还有一些其它的软件可以帮助你运行一些特殊的程序.例如,CodeWeaver 公司的CrossOver办公软件,它可以让你在Linux下运行Windows下的一些商业软件(如微软的OFFICE,Quicken等等).TransGaming 公司的WineX可以让你在

微软发布开源版ASP.NET 5:支持在Windows/Mac/Linux上运行

在今日的博客文章中,Scott Guthrie宣布了ASP.NET 5.而它所带来的最大变化,就是自诞生15年来首次推出了支持跨平台的开源版本.作为Visual Studio CTP 6的一部分,这款流行的Web开发应用程序框架,现已能够在Windows.Mac.以及Linux平台上运行.本次更新还带来了其它一些非常重大的改 变,包括无需重编译即可看到代码变动的动态开发.NuGet依赖关系管理.配置管理的新选项.依赖集成.以及更快的HTTP性能. 除了可在Windows.Mac和Linux平台上

.NET LINUX上运行SQLSERVER参数遗漏问题

问题描述 运行环境linuxcentos7.0,Mono4.014,jexus5.64描述:今日放假无聊,将以前做的MVC项目部署到Linux上,之后发现参数化查询的时候输出参数OUTPUT不见了,导致业务流程不正常,不知道那位大虾知道如何解决该问题.获得有没有大虾遇到过该问题,让我吸点经验,MVC项目运行在WindowsIIS.NET4.0上一切正常.今日将项目部署到LINUX上遇到许许多多问题,最坑爹的就是文件大小写的问题.目前遇到的问题有HttpContext.Current的Sessio

Darling项目仍然试图在Linux上运行macOS软件

Wine 项目旨在将Windows程序带到Linux上,而Darling 项目则试图将macOS/OS X程序带到Linux上.但该项目有一段时间不再活跃.Phoronix报道,项目并没有停止,根据其Github页面,它仍然在活跃开发,不过现阶段它还不能运行任何 macOS GUI程序,而只能运行基本的命令行应用,例如使用 Apple Xcode工具链编译Hello World!类型的基本macOS应用程序,然后运行在Linux上. 本文转自d1net(转载)

如何在 Ubuntu 16.10 的 Unity 8 上运行老式 Xorg 程序

随着 Ubuntu 16.10 的发布,Unity 8 越来越吸引到了更多人的关注.这是因为在这个大家最爱的 Linux 发行版的最新版本中可以体验其带有的试验性桌面.桌面发行版是人们最熟悉的 Unity 环境,但有一点点不同.它不再使用 X11 图形技术,Ubuntu 的开发者选择了另一种截然不同的方式. 原来,Unity 8 用的是 Mir,这是 Ubuntu 为了在 Linux 上提供显示服务而做出的努力.这项技术已经在 Ubuntu phone 和平板上大量使用,但是这次新版是我们在桌面