Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
wotemelon
V2EX  ›  Linux

shell 获取进程 id

  •  
  •   wotemelon ·
    wotermelon · Sep 27, 2017 · 4247 views
    This topic created in 3326 days ago, the information mentioned may be changed or developed.

    如何在 shell 中获取上一个执行的进程 id

    # test.sh
    # 想保存运行 xxx.sh 的进程 id,然后保存到文件中
    
    sh ./xxx.sh > /dev/null 2>&1 &
    echo "$!"
    echo "$!" > ./test.pid
    
    

    这样子获取的 $!不准确,正确姿势是什么

    11 replies  •  2017-09-27 21:23:17 +08:00
    21grams
    21grams
    Sep 27, 2017 via Android
    1
    echo $$
    nyanyh
    nyanyh
    Sep 27, 2017❤️1
    2
    $ sh ./1.sh > /dev/null 2>&1 &

    [1] 67891
    [1] + 67891 done sh ./1.sh > /dev/null 2>&1

    echo $!
    67891

    没发现不对的地方啊
    jsfaint
    jsfaint
    Sep 27, 2017
    3
    cat /proc/self/status
    里面有 Pid 一行,就是进程自己的 pid,PPid 是 parents 的 pid
    wotemelon
    wotemelon
    OP
    Sep 27, 2017
    4
    @nyanyh 换个说法,执行了 sh ./xxx.sh 后,xxx.sh 会后台启动一个进程,想把启动的这个进程 id 记录下来 kill,$! 是 sh ./xxx.sh 的 pid,那 xxx.sh 启动的呢?不知道描述的清楚不
    wotemelon
    wotemelon
    OP
    Sep 27, 2017
    5
    @nyanyh 在$!再加 1 就是 xxx.sh 后台启动的 pid,如果直接$! + 1 的话似乎太草率了。。。
    nyanyh
    nyanyh
    Sep 27, 2017
    6
    @wotemelon 那你在 xxx.sh 里执行完进程后面获取$!就可以
    xiaoz
    xiaoz
    Sep 27, 2017
    7
    楼上好复杂啊,直接这样不就获取了:pgrep 'pidname',如 pgrep 'test.pid'
    Beebird
    Beebird
    Sep 27, 2017
    9
    大概看明白你的需求了,假定 xxx.sh 中只启动一个进程,可以这样:


    sh ./xxx.sh > /dev/null 2>&1 &
    pid_sh=$!
    pid_sh_child=$(pgrep -P $pid_sh)
    echo $pid_sh_child
    echo $pid_sh_child > ./test.pid
    Tink
    Tink
    Sep 27, 2017 via iPhone
    10
    脚本能修改么?能的话直接在脚本里获取进程的 id 保存到文件
    choury
    choury
    Sep 27, 2017
    11
    后台第一个进程就是 %1, 第二个就是%2, 以此类推
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5565 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 02:56 · PVG 10:56 · LAX 18:56 · JFK 21:56
    ♥ Do have faith in what you're doing.