关闭终端后如何找到以 nohup 启动的进程?

how to fined a process started with nohup after closing terminal?

我必须通过 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

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

"how can I prevent such a problem in the future?"

感谢您的时间和回答。

要查找此类进程的 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/)。

区分这些进程的一种方法是通过 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": "}'; 
done