关闭终端后如何找到以 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
我必须通过 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
.
我尝试使用 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