当前位置: 首页 > 科技观察

8个用于高效管理流程的Linux命令

时间:2023-03-12 08:29:17 科技观察

使用这些关键命令在整个流程中管理您的应用程序。一般来说,应用进程的生命周期主要有三种状态:启??动、运行和停止。如果我们想成为称职的管理者,每个州都可以而且应该得到谨慎管理。这八个命令可用于管理进程的整个生命周期。启动进程启动进程最简单的方法是在命令行中键入其名称,然后按Enter键。如果要启动NginxWeb服务器,请键入nginx。也许你只是想看看它的版本。alan@workstation:~$nginxalan@workstation:~$nginx-vnginxversion:nginx/1.14.0查看您的可执行路径上面的演示假设可执行文件位于您的可执行路径中,开始该过程。了解此路径是可靠启动和管理流程的关键。管理员通常会根据需要自定义此路径。您可以使用echo$PATH查看您的可执行文件路径。alan@workstation:~$echo$PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binWHICH使用which命令查看可执行文件的完整路径。alan@workstation:~$whichnginx/opt/nginx/bin/nginx我将使用流行的网络服务器软件Nginx作为示例。假设安装了Nginx。如果执行whichnginx命令没有任何返回,那么就找不到Nginx,因为它只搜索你指定的可执行路径。可以通过三种方法来补救无法仅通过名称启动进程的情况。第一个是键入完整路径——不过,我宁愿不键入整个路径,对吗?alan@workstation:~$/home/alan/web/prod/nginx/sbin/nginx-vnginxversion:nginx/1.14.0第二种解决方案是将应用程序安装在可执行文件路径中的目录中。但是,有时这可能是不可能的,尤其是当您没有root权限时。第三种解决方案是更新您的可执行路径环境变量,以包含您要使用的特定应用程序的安装目录。此解决方案依赖于shell。例如,Bash用户需要编辑.bashrc文件中的PATH=行。PATH="$HOME/web/prod/nginx/sbin:$PATH"现在,重复您的echo和which命令或尝试检查版本。容易多了!alan@workstation:~$echo$PATH/home/alan/web/prod/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binalan@workstation:~$whichnginx/home/alan/web/prod/nginx/sbin/nginxalan@workstation:~$nginx-vnginxversion:nginx/1.14.0keepprocessrunningNOHUP当你注销或关闭终端时,进程可能不会继续跑步。通过在要运行的命令之前使用nohup命令,可以使这种特殊情况保持进程运行。此外,附加一个符号会将进程发送到后台并允许您继续使用终端。例如,假设您要运行myprogram.sh。nohupmyprogram.sh&nohup将返回正在运行的进程的PID。接下来我将详细讨论PID。管理正在运行的进程每个进程都有一个唯一的进程标识号(PID)。这个数字是我们用来管理每个进程的。我们还可以使用进程名称,我将在下面进行演示。有几个命令可以检查正在运行的进程的状态。让我们快速浏览一下这些命令。PS最常用的是ps命令。ps的默认输出是当前终端中运行的进程的简单列表。如下所示,***列包含PID。alan@workstation:~$psPIDTTYTIMECMD23989pts/000:00:00bash24148pts/000:00:00ps我想看看我之前启动的nginx进程。为此,我告诉ps显示每个正在运行的进程(-e)和完整列表(-f)。alan@workstation:~$ps-efUIDPIDPPIDCSTIMETTYTIMECMDroot100Aug18?00:00:10/sbin/initsplashroot2008月18日?00:00:00[kthreadd]root420Aug18?00:00:00[kworker/0:0H]root6208月18日?00:00:00[mm_percpu_wq]root7208月18日?00:00:00[ksoftirqd/0]root820Aug18?00:00:20[rcu_sched]root920Aug18?00:00:00[rcu_bh]root10208月18日?00:00:00[迁移/0]root1120Aug18?00:00:00[watchdog/0]root1220Aug18?00:00:00[cpuhp/0]root13208月18日?00:00:00[cpuhp/1]root14208月18日?00:00:00[watchdog/1]root1520Aug18?00:00:00[迁移/1]root1620Aug18?00:00:00[ksoftirqd/1]alan2050620496010:39pts/000:00:00bashalan205201454010:39?00:00:00nginx:主进程nginxalan2052120520010:39?00:00:00nginx:workerprocessalan2052620506010:39pts/000:00:00manpsalan2053620526010:39pts/000:00:00pageralan2056420496010:40pts/100:00:00bash在ps命令的输出中可以看到Nginx进程上面这个命令显示了将近300行,但我为了这个例子缩短了它。可以想象,尝试处理300行进程信息有点混乱。我们可以将此输出通过管道传输到grep并对其进行过滤以仅显示nginx。alan@workstation:~$ps-ef|grepnginxalan205201454010:39?00:00:00nginx:主进程nginxalan2052120520010:39?00:00:00nginx:工作进程确实更好。我们可以很快看到Nginx的PID是20520和20521。PGREPpgrep命令进一步简化了单独调用grep遇到的问题。alan@workstation:~$pgrepnginx2052020521假设您处于一个托管环境中,其中多个用户正在运行多个不同的Nginx实例。您可以使用-u选项从输出中排除其他人。alan@workstation:~$pgrep-ualannginx2052020521PIDOF另一个有用的是pidof。即使另一个同名进程正在运行,此命令也会检查特定二进制文件的PID。为了设置示例,我将Nginx复制到第二个目录并使用适当的路径前缀启动它。在现实生活中,这个实例可能位于不同的位置,例如不同用户拥有的目录。如果我运行两个Nginx实例,pidof输出会显示它们的所有进程。alan@workstation:~$ps-ef|grepnginxalan208811454011:18?00:00:00nginx:工人进程208951454011:19?00:00:00nginx:主进程nginxalan2089620895011:19?00:00:00nginx:使用grep或pgrep的工作进程将显示PID号,但我们可能无法分辨哪个实例是哪个。alan@workstation:~$pgrepnginx20881208822089520896pidof命令可用于确定每个特定Nginx实例的PID。alan@workstation:~$pidof/home/alan/web/prod/nginxsec/sbin/nginx2088220881alan@workstation:~$pidof/home/alan/web/prod/nginx/sbin/nginx2089620895TOPtop命令历史悠久,这对于查看正在运行的进程的详细信息和快速识别内存消耗等问题很有用。它的默认视图如下所示。顶部-11:56:28up1day,13:37,1user,loadaverage:0.09,0.04,0.03Tasks:292total,3running,225sleeping,0stopped,0zombie%Cpu(s):0.1us,0.2sy,0.0ni,99.7id,0.0wa,0.0hi,0.0si,0.0stKiBMem:总计16387132,免费10854648,使用1859036,3673448buff/cacheKiB交换:总计0,免费017。PID用户prnivirstshrs%cpu%mem时间+命令17270Alan200393076424728898992r0.71.55:58.22GNOME-SHELL20496ALAN2008161444541629844S0.50.30.30.3041alanalan041andtentertenter:22.16gnomeltenter39883188R0.10.00:00.17顶部1根20022556494166768S0.00.10:10.72systemd2根200000S0.00.00:00.01kthreadd4根0-200.0:0Ikerwork/0。:0H6root0-20000I0.00.00:00.00mm_percpu_wq7root200000S0.00.00:00.08ksoftirqd/0可以通过输入字母s和首选秒数来更新更改更新间隔。为了更容易监控我们的示例Nginx进程,我们可以使用-p选项调用top并传递PID。这个输出要干净得多。alan@workstation:~$top-p20881-p20882-p20895-p20896Tasks:总共4个,运行0个,睡眠4个,停止0个,僵尸0%Cpu(s):2.8us,1.3sy,0.0ni,95.9id,0.0wa,0.0hi,0.0si,0.0stKiB内存:总计16387132,免费10856008,已使用1857648,3673476buff/cacheKiB交换:总计0,免费0,已使用0。14177928availMemPIDHRUSER%PRSNI%Time+Command20881Alan200120163480S0.00:00.00nginx20882Alan200124601632S0.00:00.00nginx20895Alan200163520.00:00.00nginx1001246016161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616181818181818181818-1-1-1-snon-.0.00.00NGIN即0:00.00nginx在管理进程时,尤其是终止进程时,正确判断PID非常重要。此外,如果以这种方式使用top,每当这些进程之一停止或新进程启动时,都需要通知top有一个新进程。TERMINATEPROCESSKILL有趣的是,没有停止命令。在Linux中,有kill命令。kill用于向进程发送信号。最常用的信号是“终止”(SIGTERM)或“终止”(SIGKILL)。然而,还有更多。下面是一些例子。可以使用kill-L显示完整列表。1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM请注意,信号编号??9是SIGKILL,通常我们会发出kill-920896这样的命令,默认的信号是15,也就是SIGTERM。请记住,许多应用程序都有自己的停止方法。Nginx使用-s选项传递停止或重新加载等信号。通常,我更喜欢使用特定于应用程序的方法来停止操作。不过我会演示使用kill命令停止Nginx进程20896,然后使用pgrep确认已经停止。PID20896不再出现。alan@workstation:~$kill-920896alan@workstation:~$pgrepnginx20881208822089522123PKILL命令pkill与pgrep类似,它可以按名称搜索。这意味着必须非常小心地使用pkill。在我的Nginx示例中,如果我只想杀死一个Nginx实例,我可能不会选择使用它。我可以将Nginx选项-sstop传递给特定实例以消除它,或者我需要使用grep来过滤整个ps输出。/home/alan/web/prod/nginx/sbin/nginx-sstop/home/alan/web/prod/nginxsec/sbin/nginx-sstop如果我想使用pkill,我可以包含-f选项来让pkill过滤整个命令行参数。这当然也适用于pgrep。所以,在执行pkill-f之前,首先我可以用pgrep-a确认。alan@workstation:~$pgrep-anginx20881nginx:masterprocess./nginx-p/home/alan/web/prod/nginxsec20882nginx:workerprocess20895nginx:masterprocessnginx20896nginx:workerprocess我也可以使用pgrep-f来缩小我的结果。具有相同参数的pkill将停止进程。alan@workstation:~$pgrep-fnginxsec20881alan@workstation:~$pkill-fnginxsecpgrep(especiallypkill)要记住的关键点是你必须始终确保你的搜索结果是准确的,这样你就不会无意中影响到错误的过程。大多数这些命令都有很多命令行选项,所以我总是建议阅读每个命令的手册页。虽然这些命令中的大多数都存在于Linux、Solaris和BSD等平台上,但也存在一些差异。在命令行上工作或编写脚本时,请始终进行测试并准备好根据需要进行更正。