为了运行我的 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`