打印 Matlab 实例的进程 ID (PID)

打印 Matlab 实例的进程 ID (PID)

为了运行我的 Matlab 脚本,我创建了一个 shell 脚本,并为其提供了两个参数 - matlab 文件 ( $1) 的路径和日志文件 ( $2) 的路径:

nohup time matlab -some_parameters -r "run $1;exit" &>> "$2" &

当我需要终止某个 Matlab 进程时,有时很难分辨哪个进程是哪个。是否有可能以某种方式将 Matlab 进程的 pid 包含在日志文件中(即在 中$2)?

答案1

有多种方法可以标记进程的实例。您可以通过进程列表中的命令名称(例如,matlab_1而不是matlab)或通过环境变量来执行此操作。使用 PID 也是可能的。你只需要在matlab启动之前输出它:

nohup time bash -c 'echo $$; exec matlab -some_parameters -r "run '"$1"';exit"' &>> "$2" &

编辑1:

$$是 shell 的 PID,但由于该exec进程matlab只是覆盖 shell 进程,即 PID 不会改变。exec意味着在被调用的程序结束时没有跳回到shell;因为已经没有壳了。

有关我提到的其他选项的解释,请参阅我的回答这个问题

答案2

最后,Matlab 命令在调用时似乎随后跨越了其他进程(JVM)。然而,有一个未记录的功能feature返回正在运行的 Matlab 进程的 PID:

nohup time matlabR2012b -nodesktop -nosplash -nodisplay \
  -r "fprintf('PID: %s\n', num2str(feature('getpid')));run $1; exit" &> "$2" &

答案3

有一种方法可以获取 pid,但将其设置为第一行可能有点棘手,因为进程一启动,它就会开始写入日志文件。

假设这里的目标不是将第一行设置为pid,而是知道pid以便杀死进程,一旦完成nohup,您就可以将命令的pid保存在pid文件中并使用它来杀死。

nohup some_command some_parameters &
echo $! > matlab_program_1.pid
kill `cat matlab_program_1.pid`

相关内容