关闭终端后如何对nohup开始的流程进行罚款?

时间:2018-01-27 02:18:23

标签: linux process terminal nohup

我必须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 个答案:

答案 0 :(得分: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代表stdout进程的pid。这是一个符号链接,因此您需要使用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 :(得分:1)

要查找此类流程的PID,您可以使用df Index High Low MA(5)-MA(20) Maxima/Minima 0 0 100 90 -1 90 1 1 101 91 -2 90 2 2 102 92 1 102 3 3 99 88 2 102

fuser

$ fuser /path/to/outputfile

lsof

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