关闭终端后如何区分nohup启动的Julia进程及预防方案
你现在遇到的问题很常见——用nohup启动多个相同的进程后,仅凭ps命令确实很难区分谁对应哪个输出文件。下面分两部分帮你解决:
一、如何区分当前正在运行的这些Julia进程
这里有两个实用的方法:
用
lsof关联进程与输出文件
每个进程都在持续写入对应的OutputX.txt,直接用lsof命令就能找到它们的对应关系:- 如果你想找某个输出文件对应的进程:
lsof Output1.txt,结果里的PID列就是该文件对应的Julia进程ID。 - 如果你想列出所有Julia进程打开的文件:
lsof -c julia,在NAME列里找对应的Output文件名,就能匹配到对应的PID。
- 如果你想找某个输出文件对应的进程:
查看
/proc目录的文件描述符
Linux的/proc文件系统里存着每个进程的详细信息,进入某个PID对应的目录,查看文件描述符链接:ls -l /proc/<PID>/fd输出里会有类似
1 -> /path/to/Output1.txt的条目,这里的1是标准输出的文件描述符,指向的就是你指定的输出文件,这样就能精准对应进程和输出文件了。
二、未来如何避免这类进程混淆问题
下次启动耗时任务时,可以试试这些方法,从源头避免分不清进程的麻烦:
给脚本传递自定义参数
启动命令时加个唯一标识参数,比如:nohup julia test.jl --task-id=job1 > Output1.txt & nohup julia test.jl --task-id=job2 > Output2.txt &之后用
ps aux | grep julia就能看到--task-id=job1这类参数,一眼就能区分不同进程。如果愿意,还可以在test.jl里读取这个参数,把它写入日志或者输出内容里,进一步强化标识。使用独立工作目录启动
为每个任务创建单独的文件夹:mkdir job1 job2 job3 job4 cd job1 && nohup julia ../test.jl > Output.txt & cd ../job2 && nohup julia ../test.jl > Output.txt &之后用
pwdx <PID>命令就能查看每个进程的工作目录,或者ps aux里的CWD列也能看到,轻松区分不同任务。用终端复用工具替代nohup
比起nohup,tmux或screen更适合管理长期运行的任务,还能给每个会话起名字:tmux new-session -s job1 -d 'julia test.jl > Output1.txt' tmux new-session -s job2 -d 'julia test.jl > Output2.txt'重新连接服务器后,直接用
tmux attach -t job1就能回到该任务的会话,不仅能区分进程,还能随时查看实时输出,管理起来更方便。用进程管理工具规范化运行
如果是经常运行的任务,可以用systemd创建服务文件,每个任务对应一个服务(比如job1.service、job2.service),启动时用systemctl start job1,查看状态用systemctl status job1,完全不用纠结进程区分的问题,还能配置自动重启、日志轮转等功能。
内容的提问来源于stack exchange,提问作者AlirezaGH

