请参阅讨论主题,在这里为后代回答。
睡眠是一种正常的进程状态,只要进程等待某事(通常是 I/O)就会发生。该进程保留在就绪队列中,等待完成后将运行。所以我对你的进程睡眠并不感到惊讶。
也就是说,您的脚本可能完全受 CPU 限制,例如:( while :; do :; done ) & ps e $!
-- 将始终显示R
. 完全受 CPU 限制的进程极为罕见——它们确实必须在某些时候输出一些有用的东西,而这样的 I/O 会使它们进入休眠状态。而且,即使长时间不输出,通常还有其他进程在争夺CPU,内核会强制抢占。(除非您有一个非常特定的nice
级别或非常特定的内核配置,让您的非输出生成 CPU 脚本完全占用 CPU。这是非常非常罕见的情况。)
如果想更好的监控状态变化,可以使用top -d .01 -pPID
(将PID替换为实际的进程ID)。这让您可以判断它是否长时间休眠或与另一个进程争用 CPU。如果您有prstat
orlatencytop
命令,您可以查看LAT
for each(例如prstat -m 2
),它会告诉您该进程经历了多少争用。越接近 0,争用越少。
回答“我怎样才能让进程运行”的一般问题,可以这样做:nohup matlab < script.m &
. 即使在终端断开连接后,这也使进程保持活动状态。但是使用screen
意味着您不需要这样做,因为screen
管理终端会话,并且据matlab
了解,屏幕仍处于连接状态。