我必须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
的流程,它都会回答我。
我的问题是"如何指定哪个进程是哪个?"请注意,这些进程中只有输出文件名不同。
和
"将来我怎样才能防止这样的问题?"
感谢您的时间和回答。
答案 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/)。