소개 | 새로운 도구와 다양한 개발 환경이 급증하는 환경에서 모든 개발자와 엔지니어는 몇 가지 기본 시스템 관리 명령을 배우는 것이 필요합니다. 특정 명령과 툴킷은 개발자가 애플리케이션을 구성, 문제 해결 및 최적화하는 데 도움이 되는 동시에 운영자와 시스템 관리자에게 오류 발생 시 귀중한 분류 정보를 제공합니다. |
새로운 개발자이거나 자체 애플리케이션을 관리하려는 경우 다음 20가지 기본 시스템 관리 명령을 사용하면 애플리케이션을 더 잘 이해하는 데 도움이 될 수 있습니다. 또한 애플리케이션이 로컬에서는 작동하지만 원격 호스트에서는 작동하지 않는 이유와 같은 시스템 문제를 해결하는 데 도움이 될 수도 있습니다. 이러한 명령은 Linux 개발 환경, 컨테이너 및 가상 머신에 적용됩니다.
curl은 URL을 전송하는 데 사용됩니다. 이 명령을 사용하여 애플리케이션의 엔드포인트 또는 업스트림 서비스 엔드포인트에 대한 연결을 테스트할 수 있습니다. 컬은 애플리케이션이 데이터베이스와 같은 다른 서비스에 연결할 수 있는지 확인하거나 서비스가 정상 상태인지 확인하는 데에도 사용할 수 있습니다.
예를 들어 애플리케이션에서 MongoDB 데이터베이스에 액세스할 수 없음을 나타내는 HTTP 500 오류가 발생하는 경우:
으아악-I 옵션은 헤더 정보를 표시하는 데 사용되며, -s 옵션은 오류 및 진행 상황을 표시하지 않고 자동 모드를 사용한다는 의미입니다. 데이터베이스의 엔드포인트가 올바른지 확인하세요.
으아악그렇다면 무엇이 문제일까요? 애플리케이션이 데이터베이스가 아닌 다른 곳에 액세스할 수 있는지 확인하세요.
으아악괜찮은 것 같습니다. 이제 데이터베이스에 액세스해 보세요. 귀하의 애플리케이션이 데이터베이스의 호스트 이름을 사용하고 있으므로 먼저 다음을 시도하십시오:
으아악이는 데이터베이스에 대한 URL을 사용할 수 없거나 호스트(컨테이너 또는 VM)에 호스트 이름을 확인하는 데 사용할 수 있는 이름 서버가 없기 때문에 애플리케이션이 데이터베이스를 확인할 수 없음을 의미합니다.
2. 파이썬 -m json.tool/jqcurl을 사용한 후에는 API 호출 출력의 가독성이 떨어질 수 있습니다. 특정 항목을 찾기 위해 생성된 JSON 데이터의 출력 형식을 지정하려는 경우도 있습니다. Python에는 이 요구 사항을 충족하는 데 도움이 되는 내장 라이브러리가 있습니다. python -m json.tool 을 사용하여 JSON을 들여쓰기하고 구성할 수 있습니다. Python의 JSON 모듈을 사용하려면 파이프라인 메커니즘을 사용하여 JSON 파일의 출력을 입력으로 가져와 python -m json.tool 명령줄에 써야 합니다.
으아악Python 라이브러리를 사용하려면 -m(모듈) 옵션을 사용하여 출력과 Python 라이브러리를 파이프라인으로 결합합니다.
으아악고급 JSON 구문 분석을 위해 jq를 설치할 수 있습니다. jq는 JSON 입력에서 특정 값을 추출하기 위한 몇 가지 옵션을 제공합니다. 위의 Python 모듈과 같이 JSON 출력 형식을 지정하려면 출력에 jq를 적용하기만 하면 됩니다.
으아악 3.lsls 는 디렉터리의 파일을 나열하는 데 사용됩니다. 시스템 관리자와 개발자는 이 명령을 자주 사용합니다. 컨테이너 공간에서 이 명령은 컨테이너 이미지의 디렉터리와 파일을 확인하는 데 도움이 될 수 있습니다. 파일을 찾는 것 외에도 ls를 사용하여 권한을 확인할 수도 있습니다. 아래 예시에서는 권한 문제로 인해 myapp을 실행할 수 없습니다. ls -l 을 사용하여 권한을 확인하면 해당 권한에 -rw-r–r–에 "x"가 없고 읽기 및 쓰기 권한만 있음을 알 수 있습니다.
으아악 4.꼬리tail 파일의 마지막 부분을 표시합니다. 일반적으로 문제를 해결하기 위해 모든 로그 줄을 검토할 필요는 없습니다. 대신 애플리케이션에 대한 가장 최근 요청에 대한 설명을 로그에서 확인해야 합니다. 예를 들어 tail을 사용하여 Apache HTTP 서버에 요청할 때 로그에서 어떤 일이 발생하는지 확인할 수 있습니다.
로그 파일을 추적하고 요청이 있을 때 이를 보려면 tail -f 를 사용하세요.
-f 옵션은 다음을 의미하며, 로그가 파일에 기록될 때 출력됩니다. 아래 예에는 몇 초마다 엔드포인트에 도달하고 요청을 기록하는 백그라운드 스크립트가 있습니다. 실시간으로 로그를 추적하는 것 외에도 -n 옵션과 함께 tail을 사용하여 파일의 마지막 100줄을 볼 수도 있습니다.
으아악 5.고양이cat 은 주로 파일 내용을 보고 파일을 병합하는 데 사용됩니다. cat 을 사용하여 종속성 파일의 내용을 검사하거나 로컬로 빌드된 애플리케이션의 버전을 확인할 수 있습니다.
으아악위의 예에서는 Python Flask 애플리케이션에 Flask가 종속성으로 나열되어 있는지 확인합니다.
6.grepgrep은 특정 패턴 일치(정규 표현식 포함)를 사용하여 텍스트를 검색할 수 있습니다. 다른 명령의 출력에서 특정 패턴을 찾는 경우 grep 은 관련 줄을 강조 표시합니다. 이 명령을 사용하여 로그 파일, 특정 프로세스 등을 검색할 수 있습니다. Apache Tomcat이 시작되었는지 확인하려면 명령줄의 수에 압도될 수 있습니다. 그러나 출력 콘텐츠를 grep 명령과 파이프라인으로 결합하면 서버가 시작되었음을 나타내는 줄을 격리할 수 있습니다.
으아악 7.psps 프로세스의 다양한 상태 정보를 보는 데 사용됩니다. 이 명령을 사용하여 실행 중인 응용 프로그램을 확인하거나 예상 프로세스를 확인합니다. 예를 들어 실행 중인 Tomcat 웹 서버를 확인하려면 Tomcat의 프로세스 ID를 가져오는 옵션과 함께 ps 를 사용하면 됩니다.
$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi root 59 0 0 18:55 pts/0 00:00:00 /bin/sh root 75 59 0 18:57 pts/0 00:00:00 ps -ef
为了更好的易读性,可使用 grep 和 ps 组合成管道。
$ ps -ef | grep tomcat root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi
env 用于列出所有环境变量及为其赋值。在故障排除期间,你可能会发现需要检查是否有错误的环境变量来阻止应用程序启动。在下面的示例中,该命令用于检查程序主机上设置的环境变量。
$ env PYTHON_PIP_VERSION=9.0.1 HOME=/root DB_NAME=test PATH=/usr/local/bin:/usr/local/sbin LANG=C.UTF-8 PYTHON_VERSION=3.4.6 PWD=/ DB_URI=mongodb://database:27017/test
请注意,该应用程序正在使用 Python 3,并具有连接到 MongoDB 数据库的环境变量。
9. toptop 用于显示系统中各个进程的信息和资源占用状况,类似于 Windows 的任务管理器。使用该命令可确定哪些进程正在运行,以及它们消耗了多少的内存和 CPU。一种常见的情况是当你运行一个应用程序时,它在一分钟后挂掉。这时,你首先检查应用程序的返回错误,发现是一个内存错误。
$ tail myapp.log Traceback (most recent call last): MemoryError
你的应用是否真的内存不足?要确认这个问题,可使用 top 来查看应用程序消耗多少 CPU 和内存。当使用 top 命令后,您注意到一个 Python 应用程序使用了大部分的 CPU,其内存使用量也迅速攀升。当它运行时,如果进程是你的应用程序,则按”C”键来查看完整命令并进行逆向工程。发现原来是你的内存密集型应用程序(memeater.py)。当你的应用程序已经用尽内存,系统会杀掉它并返回一个内存不足(OOM)的错误。
应用程序的内存和 CPU 使用量增加,最终因为内存不足而被杀掉。
通过按下”C”键,可以看到启动该应用程序的完整命令
除了检查应用程序,还可以使用 top 来调试其他使用 CPU 或内存的进程。
10. netstatnetstat 用于显示网络状态信息。该命令可显示正在使用的网络端口及其传入连接。但是,netstat 在 Linux 中不能开箱即用。如果需要安装它,需要在 net-tools 包中找到它。作为在本地进行试验或将应用程序推送到主机的开发者,可能会收到端口已被分配或地址已被使用的错误。使用 netstat 得到协议、进程和端口这些信息,下图表明 Apache HTTP 服务器已经在下面的主机上使用了 80 端口。
使用 netstat -tulpn 表明 Apache 已经在这台机器上使用了 80 端口。
11. ip address如果 ip address 在你的主机上不能使用,必须使用 iproute2 包进行安装。ip address 用于显示应用程序的主机接口和 IP 地址。可使用 ip address 来验证你的容器或主机的 IP 地址。例如,当你的容器连接到两个网络时,ip address 可显示哪个接口连接到了哪个网络。对于简单的检查,可以随时使用 ip address 命令获取主机的 IP 地址。下面的示例展示了在接口 eth0 上的 Web 层容器的 IP 地址为 172.17.0.2
使用 ip address 显示 eth0 接口的 IP 地址为 172.17.0.2
12. lsoflsof 用于列出当前系统打开的文件(list open files)。在某些 Linux 系统中,可能需要使用 lsof 包来安装lsof。在 Linux 中,几乎任何和系统的交互都被视为一个文件。因此,如果你的应用程序写入文件或代开网络连接,lsof 将会把这个交互映射为一个文件。与 netstat 类似,可使用 lsof 来检查侦听端口。例如,如果要检查 80 端口是否正在被使用,可使用 lsof 来检查哪个进程正在使用它。下面的示例中,可以看到 httpd (Apache) 在 80 端口上侦听。还可以使用 lsof 来检查 httpd 的进程ID,检查 Web 服务器的二进制文件所在位置(/usr/sbin/httpd)。
Lsof 表明了 httpd 在 80 端口上侦听。检查 httpd 的进程ID还可以显示所有需要运行的文件httpd。
打开文件列表中的打开文件的名称有助于确定进程的来源,特别是 Apache。
13. df可以使用 df 显示空闲的磁盘空间(display free disk space)以排查磁盘空间问题。挡在容器管理器上运行应用程序时,可能会收到一条错误信息,提示容器主机上缺少可用空间。虽然磁盘空间应该由系统管理程序来管理和优化,你仍可以使用 df 找出目录中的现有空间并确认是否没有空间。
Df 显示每个文件系统的磁盘空间、绝对空间以及其可用性。
-h 选项表示以可读性较高的方式来显示信息,上面的例子表示这个主机具有大量的磁盘空间。
14. dudu 命令也是用于查看使用空间的,但是与 df 命令不同的是 du 命令是对文件和目录磁盘使用的空间的查看,要获取有关哪些文件在目录中使用磁盘空间的更多详细信息,可以使用 du 命令,和 df 命令还是有一些区别的。例如,你想了解那个日志文件占用 /var/log 目录最多的空间,可以使用 du 命令加上 -h 选项和用于获取总大小的 -s 选项。
$ du -sh /var/log/* 1.8M /var/log/anaconda 384K /var/log/audit 4.0K /var/log/boot.log 0 /var/log/chrony 4.0K /var/log/cron 4.0K /var/log/maillog 64K /var/log/messages
上面的示例中显示了 /var/log 下的的最大目录为 /var/log/audit。可以将 du 和 df 搭配使用,以确定在应用程序的主机上使用的磁盘空间。
15. id要检查运行应用程序的用户,可使用 id 命令来返回用户身份。id 命令可以显示真实有效的用户ID(UID)和组ID(GID)。下面的示例使用 Vagrant 来测试应用程序并隔离其开发环境。登录进 Vagrant 盒子后,如果尝试安装 Apache HTTP Server(依赖关系),系统会提示你需要以 root 身份执行该命令。要检查你的用户ID和组ID,使用 id 命令,会发现你正在”vagrant”组中以”vagrant”用户身份运行。
$ yum -y install httpd Loaded plugins: fastestmirror You need to be root to perform this command. $ id uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
要解决此问题,必须以超级用户的身份运行该命令,这将提供提升的权限。
16. chmodchmod 命令用来变更文件或目录的权限。当你在主机上首次运行应用程序的二进制文件时,可能会收到错误提示信息“拒绝访问”。如 ls 的示例所示,可以用于检查应用程序二进制文件的权限。
$ ls -l total 4 -rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
这表明您没有权限(没有“x”)来运行二进制文件。chmod 可以修改权限,使的用户能够运行二进制文件。
$ chmod +x test.sh [vagrant@localhost ~]$ ls -l total 4 -rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
如例子所示,这将更新权限,使其具有可执行的权限。现在当你尝试执行二进制文件时,应用程序不会抛出拒绝访问的错误。当将二进制文件加载到容器时,Chmod 可能很有用。它能保证容器具有合适的权限以执行二进制文件。
17. dig / nslookupdig 命令是常用的域名查询工具,可以用来测试域名系统工作是否正常。域名服务器(DNS)有助于将 URL 解析为一组应用程序服务器。然而,你会发现有些 URL 不能被解析,这会导致应用程序的连接问题。例如,假如你尝试从应用程序的主机访问你的数据库。你收到一个”不能解析”的错误。要进行故障排查,你尝试使用 dig(DNS 查询工具)或 nslookup(查询 Internet 域名服务器)来确定应用程序似乎无法解析数据的原因。
$ nslookup mydatabase Server: 10.0.2.3 Address: 10.0.2.3#53 ** server can't find mydatabase: NXDOMAIN
使用 nslookup 显示无法解析 mydatabase。尝试使用 dig 解决,但仍是相同的结果。
$ dig mydatabase ; > DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 > mydatabase ;; global options: +cmd ;; connection timed out; no servers could be reached
这些错误可能是由许多不同的问题引起的。如果无法调试出根本原因,与系统管理员联系以进行更多的调查。对于本地测试,这些问题可能表示你的主机的域名服务器未正确配置。要使用这些命令,需要安装 BIND Utilities 包。
18. iptablesiptables 用于阻止或允许 Linux 主机上的流量,用于 IP 包过滤器管理,类似于网络防火墙。此工具可阻止某些应用程序接收或发送请求。更具体地说,如果您的应用程序难以访问另一个端点,可能已被 iptables 拒绝流量访问该端点。例如,假设您的应用程序的主机无法访问 Opensource.com,您使用 curl 来测试连接。
$ curl -vvv opensource.com * About to connect() to opensource.com port 80 (#0) * Trying 54.204.39.132... * Connection timed out * Failed connect to opensource.com:80; Connection timed out * Closing connection 0 curl: (7) Failed connect to opensource.com:80; Connection timed out
连接超时。您怀疑某些东西可能会阻塞流量,因此您使用 -S 选项显示 iptables 规则。
$ iptables -S -P INPUT DROP -P FORWARD DROP -P OUTPUT DROP -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT -A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT
前三个规则显示,默认情况下流量已被丢弃。剩下的规则表示允许 SSH 和 DNS 流量。在这种情况下,如果需要允许流量到外部端点的规则,请跟上 sysadmin。如果这是用于本地开发或测试的主机,可使用 iptables 命令来允许合适的流量。添加允许到主机的流量的规则时一定要谨慎。
19. sestatus通常会在企业管理的应用程序主机上使用 SELinux(一个 Linux 安全模块)。SELinux 对主机上运行的进程提供最低权限的访问,防止潜在的恶意进程访问系统上的重要文件。某些情况下,应用程序需要访问特定文件,但可能会发生错误。要检查 SELinux 是否阻止了应用程序,使用 tail 和 grep 在 /var/log/audit 日志记录中查找”denied”(被拒绝)的信息。否则,使用 sestatus 来检查是否启动了 SELinux。
$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 28
上面的输出表示应用程序的主机已启用 SELinux。在本地开发环境中,可以更新 SELinux 使得权限更宽松。
20. history当你使用大量的命令进行测试和调试时,可能会忘记有用的命令。每个 shell 都有一个 history 命令的变体。它可显示自会话开始以来使用的命令的历史记录。可以使用 history 来记录用来排除应用程序故障的命令。history 命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。
$ history 1 clear 2 df -h 3 du
如果希望执行之前历史记录中的命令,但又不想重新输入,该怎么办?使用符号 ! 即可,可以使用符号 ! 执行指定序号的历史命令。例如,要执行第 2 个历史命令,则输入!2,
在需要重新执行的命令的指定编号前添加 ! 即可重新执行
这些基本命令能增强排查故障的专业技能,可检查为什么应用程序可以在一个开发环境中工作,而在另一个开发环境中则不可以。许多系统管理员使用这些命令来调试系统问题。了解一些有用的故障排查命令可帮助解决应用程序的问题。
위 내용은 시스템 관리자를 위한 20가지 필수 명령의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!