首页 文章

如何在关闭终端后对nohup进行罚款?

提问于
浏览
2

我必须ssh到服务器运行一些需要很长时间才能完成的代码 . 所以我需要使用 nohup 命令 .

我使用nohup命令启动了多个进程,如下所示:

nohup julia test.jl > Output1.txt &
  nohup julia test.jl > Output2.txt &
  nohup julia test.jl > Output3.txt &
  nohup julia test.jl > Output4.txt &

问题是我关闭了终端,当我打开另一个终端时,我无法使用 jobs -l 获取进程名称和ID .

我尝试使用 ps -p ,但它回答了我所有上述过程的相同答案 julia .

我的问题是“如何指定哪个流程是哪个?”请注意,这些进程中只有输出文件名不同 .

“我怎么能在将来阻止这样的问题?”

谢谢你的时间和答案 .

2 回答

  • 2

    区分这些过程的一种方法是通过 stdout 重定向,并且使用 ps 命令没有好办法 .

    如果安装了 pgrep ,则可以使用简单的 for loop 来了解哪个 pid 对应于哪个输出文件 . 像下面的东西,

    for pid in $(pgrep julia); 
    do 
       echo -n "$pid: "; 
       readlink -f /proc/${pid}/fd/1; 
    done
    

    /proc/${pid}/fd/1 表示具有 pid 的进程的 stdout . 这是一个符号链接,因此您需要使用 readlink 来检查源 .

    输出:

    12345: /path/to/output1.txt
    12349: /path/to/output2.txt
    12350: /path/to/output3.txt
    

    另一种方法是使用 lsof -p $pid ,但我发现它比你想要实现的重一点,但输出会是相同的 .

    for pid in $(pgrep julia); 
    do 
       lsof -p $pid | awk -v var=$pid '/1w/ {print var": "$9}'; 
    done
    
  • 1

    要查找此类进程的PID,可以使用 fuser

    $ fuser /path/to/outputfile
    

    lsof

    $ lsof | grep "outputfile"
    

    为了避免将来出现这种情况,请在服务器上使用GNU Screen(https://linode.com/docs/networking/ssh/using-gnu-screen-to-manage-persistent-terminal-sessions/) .

相关问题