多亏了有趣的 Raspberry Pi,才开始潜入终端。我有一件特别的事情仍然让我摸不着头脑:
我注意到不同的守护进程 / 服务 / 进程 / 应用程序 / 等等(还有什么我要遗漏的吗?),它们的名称也不同。
这就是我的意思:
(程序,文件名)
nano mytextfile
(服务、行动、程序)
service restart nginx
(动作、程序)
killall openvpn
在这一点上,它基本上是我的记忆练习,我还不理解语法。是这样的吗?:
"service" when it's a service, as opposed to...? >
action for program if applicable >
name of program >
additional parameters
有人可以简要解释一下这些和访问它们的不同方式之间的区别吗?
在您列出的潜在模式中,这是唯一实际存在的模式:
首先是几个词的定义:
sshd
)、Web 服务器(Apache)、网络连接管理器(NetworkManager
、ModemManager
)...service
作为 SysVinit 风格的启动/关闭脚本的简单包装器开始了它的生命。如果在 Linux 中使用传统的 SysVinit 作为init
系统(进程 #1,“所有进程之母”),这些脚本通常位于/etc/init.d
目录中。这些脚本具有标准化的参数:start
启动服务、stop
停止服务或status
查询服务状态。还有其他几个。但是因为写
/etc/init.d/<service name> <action parameter>
起来很乏味,所以有人做了一个简单的包装脚本:service <name> <action parameter>
原本的意思就是/etc/init.d/<name> <action parameter>
.当 SysVinit 被更现代的替代品(
systemd
或upstart
其他)取代时,人们希望保留熟悉的service
命令,并将其作为init
系统等效命令的包装器。使用时systemd
,service <name> <action parameter>
通常只是systemctl <action parameter> <name>
. 注意更改的参数顺序。首先在 Unix 中,哲学是一切都是文件。在您的所有命令中,您只处理硬盘上的文件:
mytextfile
,nginx
或者openvpn
都是文件。现在,文件代表什么以及您可以对它们执行什么操作仅由约定决定。有时,来自其他一些操作系统的文件具有扩展名以更好地说明它们的作用。就像您可以编辑的文本文件将
.txt
在末尾使用,程序将是.sh
or.php
or.pl
等。但是只有约定(x
用于执行的 unix 位是另一个提示什么是数据与什么是可执行文件)您列出的是对不同对象/文件 ( , , ) 的操作 (
nano
,service restart
, )。killall
mytextfile
nginx
openvpn
根据您选择的操作和对象,结果会有所不同。你也可以这样做
nano openvpn
,它会编辑或创建一个名为openvpn
你所在位置的文件(这可能无用且令人不安,但工具并不禁止这样做)。现在至于你的具体行动:
nano
是一个文本编辑器,用于修改任何文件的内容(当然,如果它是二进制文件 - 像一些可执行文件但不是全部 - 用来做任何有用的事情都是错误的工具)service restart
是一个带有重启“子动作”的动作,它使用系统上的当前框架来处理启动/停止长寿命进程,也称为守护进程;请注意,这只是其中一种情况,可能在/etc/init.d/nginx restart
其他地方或systemctl restart nginx.service
;restart
作为子动作存在的事实完全特定于service
命令;任何命令都可以有不同的语法,具有不同的开关、参数、子操作等。没有人能记住它们。killall
是一个查看所有当前正在运行的进程列表并杀死与给定名称匹配的进程的命令(警告:此命令在所有 Unix 系统上执行的操作不同,因此请务必在您的主机上阅读其手册在使用它之前使用它),因此您实际上可以提供任何名称,而不必提供作为磁盘文件存在的名称无论如何,您的许多术语都是同义词并且定义松散。应用程序是可以运行(被执行)的任何东西,当它运行时,它是由内核在许多其他进程中处理的进程。长期存在的应用程序通常不受用户直接控制,例如像网络服务器这样的网络应用程序,过去通常被称为守护进程,而今天通常被称为服务(更多
systemctl
参见上面的示例语法)你不应该记住任何类型的东西。您将通过使用它们来学习它,例如,如果您将其
nginx
用作 Web 服务器,则需要重新启动它并在您的特定平台上重新启动它,service restart
依此类推。尽管有一些标准约定,例如:
没有什么能真正阻止开发人员出于任何原因打破约定并使用他们想要的任何语法。所以实际上它只取决于您当时使用的应用程序。
通常,您会发现上面链接的 GNU 标准非常常见,并且随着时间的推移会注意到许多命令对相似的事情使用相似的参数(例如:
-v
用于打印详细输出)不要担心记住这些。对于您经常使用的应用程序,您最终会掌握语法,它最终会成为第二天性。对于您不熟悉的应用程序,总会有手册页或
--help
标志。大致了解基本命令的作用,能够打开并快速解析手册页比记住每个命令的标志要重要得多。
“模式”由 shell 的语法给出。在简单的情况下,它是一个命令(或者更确切地说是一个实用程序),后跟参数。参数可能是选项,选项可能有选项参数。在选项之后可能还有其他操作数。
例子:
ls
是命令,-l
是一个选项(没有选项参数),并且dir
是一个操作数。我们知道这dir
不是选项的选项参数,-l
因为我们已经阅读了ls
手册,其中概要部分描述了实用程序的调用顺序。例子:
git
是命令,由于命令名称后面没有选项,其余的被视为操作数。由git
命令来解释这一点。如果您愿意,您可能希望将commit
操作数称为“子命令”,并将-p
此子命令称为“选项”。例子:
这里,
cc
是命令,两者-o
都是-Wall
选项。该-o
选项code.o
作为选项参数。根据cc
命令,-Wall
选项实际上可能被解析为-W all
,即作为带有选项参数的选项(单字母选项在其选项参数之前不需要空格)。code.c
是一个操作数,因为它出现在所有选项之后。“参数”、“选项”和“选项参数”是POSIX 标准使用的词。该标准使用单词“utility”而不是“command”,因为命令可能是简单的、列表、复合、管道等。例如,
ls -l dir
是一个使用实用程序的(简单)命令ls
,并且{ head -n 20 | tail -n 5; } >file
是包含管道的复合命令和两个简单的命令。可以说,所有实用程序调用都是“动作”。说的意思是“用操作数
killall myprog
启动实用程序”。在这种情况下,其效果将是实用程序向进程发送信号。killall
myprog
同样,使用和作为两个操作数
service restart nginx
调用service
实用程序的操作。其效果将是重新启动服务。restart
nginx
nginx
同样,
nano somedoc
是调用nano
编辑器等的动作等等。