如何获取远程Linux bash脚本中执行的程序的PID

如何获取远程Linux bash脚本中执行的程序的PID

我在 Mac 计算机上通过 ssh 访问 Linux 计算机来运行模拟。我目前正在并行运行多个命令(我将它们放在后台 & 中),当它们完成时,我提取感兴趣的文件,然后删除所有命令输出并重做它。

我想知道是否可以使用 PID 检查这些任务是否完成,以便自动提取所需的文件并再次启动完全相同的命令。我在这里发布一条消息,以了解如何获取通过 ssh -c 执行的命令的 PID,这不是我完成的(因为我在远程 Linux 中)。

我尝试了中显示的解决方案如何获取刚刚启动的进程的 pid为了获得 PID,但是 $! ssh -c 和 jobs -p 都没有给我正确的 PID。我想知道它是否不起作用,因为我正在远程访问(htop 中出现的命令是 ssh -c ...)或者我只是做得很糟糕。

这是我的第一个 bash 脚本:

#!/bin/bash

./createFiles.sh $1 # create the needed $1 folders

for i in $(seq 1 $1)
do
    cd $i
    myCommand &
    cd ..
done

当这个完成后,我使用:

#!/bin/bash

for i in $(seq 1 $1)
do
    cd $i
    cp output/file.txt ../file_$2_$i.txt # $2 is the number of the run
    cd ..
done

./deleteFiles.sh $2 # delete the needed $1 folders to start anew

然后我将这两个循环循环 5 次。我想知道是否可以自动循环 5 次而不需要我站在电脑前。

如果你们中的任何人有任何想法,那就太好了:)

PS:我希望说清楚,英语不是我的母语嗨嗨

答案1

您正在构建 GNU Parallel :)

--transfer --return --cleanup 正在做您想做的事情。

阅读第 8 章:https://zenodo.org/record/1146014

答案2

感谢 @mashuptwice 的回答,我成功地做到了这一点(即:您可以使用$$从脚本内部获取 PID。您还可以使用pgrep从脚本外部查找给定进程名称的 PID。 – mashuptwice 3 月 18 日 14 点: 07)

然后使用 bash while-ssleep到达了我想要的地方:D

为了透明起见:

#!/bin/bash

for j in $(seq 1 $2)
do
    ./createFiles.sh $1 # create the needed $1 folders

    for i in $(seq 1 $1)
    do
        cd $i
        myCommand &
        cd ..
    done

    sleep 5 # Wait to be sure that the commands were started

    pgrep -u myUser myCommand > PIDs.txt

    while [ -s PIDs.txt ]
    do
        echo not finished yet
        pgrep -u myUser myCommand > PIDs.txt
        sleep 10
    done
    cat PIDs.txt # Debug print

    ./mvFiles.sh $1 $j # extract the needed files and remove the now useless outputs
    rm PIDs.txt
done

相关内容