AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 528985
Accepted
lazarus
lazarus
Asked: 2014-09-27 10:42:07 +0800 CST2014-09-27 10:42:07 +0800 CST 2014-09-27 10:42:07 +0800 CST

如何查看当前运行命令的 PID?

  • 772

在阅读有关 linux 的文章时,我得到了:

默认情况下,在脚本中创建的变量仅对当前 shell 可用;子进程(子 shell)将无法访问已设置或修改的值。允许子进程查看这些值需要使用导出命令。

我试图找到有关子外壳的信息,然后遇到了是否有任何命令可以查看进程的工作方式?,我发现 ltrace 可以用于此,当我搜索如何使用ltraceorstrace时,我发现这PID是必需的属性。

现在,如果我想知道的 PID $ cp file1 file2,我该怎么做??这样我就可以使用ltrace它了??

command-line
  • 2 2 个回答
  • 2710 Views

2 个回答

  • Voted
  1. Best Answer
    Volker Siegel
    2014-09-27T18:03:36+08:002014-09-27T18:03:36+08:00

    当前命令的PID

    当您在后台启动命令时,会显示您自己的 shell 中命令的 PID。如果当前命令在前台运行,shell 大部分时间都在等待它完成,我们也必须等待——除非我们想在这个 shell 之外使用一个工具;请参阅下面的选项。

    作为示例命令,我将使用它ping每 5 秒发送一个请求 10 次:

    ping -i 5 -c 10 example.com 
    

    现在,我将使用&它在后台运行它:

    $ ping -i 5 -c 10 example.com &
    [1] 12238
    $ PING example.com (93.184.216.119) 56(84) bytes of data.
    64 bytes from 93.184.216.119: icmp_seq=1 ttl=55 time=118 ms
    64 bytes from 93.184.216.119: icmp_seq=2 ttl=55 time=117 ms
    64 bytes from 93.184.216.119: icmp_seq=3 ttl=55 time=117 ms
    

    [1] 12238告诉我们进程有进程id,简称PID 12238 ;而且这是当前在此 shell 中运行的第一个后台作业。

    示例:跟踪库调用

    在同一个终端中,我们得到 的输出ping,所以我们最好在另一个终端中运行 ltrace(ping具有特殊的 root 权限,所以我们需要sudo弄乱它的内部):

    $ sudo ltrace -p 12238      
    [sudo] password for siegel: 
    gettimeofday(0x7fff7f0b6900, 0)                                           = 0
    gettimeofday(0x7fff7f0b68e0, 0)                                           = 0
    sendmsg(3, 0x60a300, 2048, 24)                                            = 64
    recvmsg(3, 0x7fff7f0b6970, 0, 0)                                          = 84
    __printf_chk(1, 0x40813b, 64, 0x60a560)                                   = 29
    __printf_chk(1, 0x4077ea, 4, 28)                                          = 11
    __printf_chk(1, 0x40814d, 55, 11)                                         = 7
    __printf_chk(1, 0x408162, 118, 7)                                         = 12
    _IO_putc('\n', 0x7f7836d89400)                                            = 10
    fflush(0x7f7836d89400)                                                    = 0
    gettimeofday(0x7fff7f0b6900, 0)                                           = 0
    poll(0x7fff7f0b6950, 1, 4880, 0)                                          = 0
    gettimeofday(0x7fff7f0b6900, 0)                                           = 0
    gettimeofday(0x7fff7f0b68e0, 0)                                           = 0
    sendmsg(3, 0x60a300, 2048, 24)                                            = 64
    recvmsg(3, 0x7fff7f0b6970, 0, 0)                                          = 84
    __printf_chk(1, 0x40813b, 64, 0x60a560)                                   = 29
    __printf_chk(1, 0x4077ea, 5, 28)                                          = 11
    __printf_chk(1, 0x40814d, 55, 11)                                         = 7
    __printf_chk(1, 0x408162, 118, 7)                                         = 12
    _IO_putc('\n', 0x7f7836d89400)                                            = 10
    fflush(0x7f7836d89400)                                                    = 0
    gettimeofday(0x7fff7f0b6900, 0)                                           = 0
    poll(0x7fff7f0b6950, 1, 4881, 0)      
    

    这是两次“ping”期间库调用的痕迹。


    一般查找正在运行的进程的 PID

    由于标题问题不是很具体,这里有一些其他方法可以找到当前正在运行的命令的 PID:

    • 按命令名称搜索进程
      pgrep -x cmd 请注意变体pgrep cmd是错误的:它数学为子字符串

    • 通过带参数的命令行搜索
      pgrep -f cmdarg

    • 列出属于当前 shell(会话)的进程,如后台进程或 shell 本身
      ps -s $$

    • 列出所有进程:“进程状态”
      ps aux

    • 以更具交互性的方式列出流程:“流程表”
      top

    • 您同时需要的一切:一个进程表,与ltrace和集成strace:
      htop
      它是top具有增强的 UI 和可配置性的变体,外加一些额外功能:
      使用光标线选择一个进程,然后按Lforltrace或sfor strace!

    • 4
  2. David Foerster
    2014-09-29T11:41:35+08:002014-09-29T11:41:35+08:00

    bash,dash(以及许多其他 shell)具有用于作业控制的内置命令。如果您在后台运行命令

    sleep 9999 &
    

    您可以发现当前 shell 的所有后台命令:

    $ jobs
    [1]+  Running                 sleep 9999 &
    

    如果您需要其中一个的进程 ID,您可以使用 获取它,上面的作业列表(第一列)中的作业 ID 在jobs -p %N哪里。N还有一个特殊变量$!,shell 将用最近在后台执行的命令的 PID 代替。

    有关详细信息和更多选项,请查看手册的相关部分bash(1)(直接链接到 HTML 版本中的作业控制部分),dash(1)或查看您选择的 shell。TLDP 也有一个关于作业控制的重要部分。

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve