司马颙把人头送给司马越,想和司马越议和。司马越收下张方的首级后,却不答应议和。遣回使者后,司马越立刻令幽州将领祁弘做前锋,去长安接回惠帝,并派部将宋胄攻打洛阳,刘琨攻打荥阳。刘琨带着张方的首级来到荥阳城下,将首级呈给守将吕朗,吕朗急忙开城投降。宋胄在途中碰到邺城将领冯嵩奉命前来,于是二人一同赶往洛阳。留居洛阳的司马颖只好往长安逃去。司马颖逃到华阴时,听说司马颙和司马越已经议和,担心司马颙谋害自己,就不敢再往西逃。司马颙见司马越并没有退兵,开始后悔杀死张方。司马颙派弘农太守彭随和刁默率兵抵御司马越。祁弘旗下的鲜卑兵把彭、刁的部下打散成几个部分,彭随、刁默两队死伤无数。兵败的消息接连传到关中,司马颙吓得魂飞魄散,不知所措。不久,有人来报,说敌军已经深入。司马颙扬鞭逃跑,侥幸出城,环顾四周,心想孤身一人不能远去,就策马向太白山奔去。
祁弘杀进长安,城内无人敢挡,任由鲜卑兵烧杀抢掠。百官都逃到山里去了,惠帝还在行宫,没人保护。刚好司马越赶到,下令禁止劫掠,随后进宫拜见,又召集百官,宣布即日东归,命太弟太保梁柳为镇西将军,留守关中,自己则带领各路军队奉惠帝回洛阳。到了洛阳,惠帝登上旧殿,朝见百官。
永兴三年(306年)六月,惠帝又改元为光熙元年,下诏封赏迎驾诸臣,升司马越为太傅;范阳王司马虓为司空,仍驻镇邺城;司马模为镇东大将军,镇守许昌;王浚为骠骑大将军,统领东夷河北军事,兼任幽州刺史。此外如皇太弟以下,仍然各司其职。对司马颖和司马颙只下了一道赦书。
成都王司马颖从洛阳逃到华阴后,听说惠帝回了洛阳,先是折回南行,后来又渡河北上,准备投靠公师藩。顿邱太守冯嵩在路上截住司马颖,把他送到邺城囚禁起来。公师藩得知后,亲自带兵攻打邺城,司马虓急忙命兖州刺史苟晞带兵御敌。交战中公师藩被杀,汲桑、石勒等人逃跑。不久,司马虓在邺城病死。长史刘舆担心邺城人会释放司马颖,于是令人假充朝使,逼司马颖自尽,然后为司马虓发丧,并报告朝廷。司马颖的两个儿子也被杀死。
太傅司马越听说司马颙入关,马上派督护麋晃带兵征讨,麋晃在路上接到三军败退的消息,不敢进军。谁知司马颙又遭遇内变,长史杨腾想背叛司马颙归附司马越,于是假传司马颙的命令,令牵秀罢兵。牵秀出营迎接,却当头挨了一刀,倒地身亡。这一刀便是杨腾下的毒手。杨腾骗牵秀的属下,说自己是奉命行事。士兵们见牵秀无辜被杀,对司马颙更加不服,不肯为他效命。杨腾把牵秀的首级送给麋晃,麋晃正打算进关,都城却传出急诏,说惠帝暴崩,皇太弟登基,大赦天下。麋晃知道不必去讨罪了,便在途中等候,静待后命。
据说惠帝是被太傅司马越毒死的。一天晚上,惠帝在显阳殿里吃了几个饼子,不一会儿,忽然肚子绞痛起来。内侍召进御医时,惠帝已经不省人事了。御医诊视六脉,发现脉搏已如游丝,于是摇头说:“罢了!罢了!”宫人问是什么病,他不敢说明,等穷究细问后,他才轻轻地说出“中毒”二字,然后一溜烟地出宫去了。毒究竟是谁下的,无从追究。不过司马越掌握政权后,对皇帝暴崩的事一点儿也不追究,只令侍中华混赶紧召皇太弟司马炽继位。说司马越可疑,还有一个原因,便是皇后羊氏担心皇太弟司马炽被立为皇帝,自己只能做皇嫂,做不了太后,于是密召清河王司马覃进入尚书阁,有意推立司马覃。恰巧司马炽也进来了,又有太傅司马越在旁拥立,羊氏一时尴尬,只好闭口不言,任司马炽即位。照此看来,宫廷内外早已明争暗斗,羊皇后想立司马覃,司马越想立司马炽,只可怜那呆皇帝被人无辜毒死。
皇太弟司马炽是武帝的幼子,即晋怀帝,继承兄位后,大赦天下,命太傅司马越辅政。司马越请出诏书,封河间王司马颙为司徒。司马颙应诏前去洛阳,当下携着家眷上车,出关东行。路过新安时,忽然来了一班凶悍的武夫,手持利刃,拦住司马颙的去路,大声喝道:“快留下脑袋!”司马颙被吓呆了,不得不硬着头皮,战栗地问来人:“你们是谁,居然敢拦我的车?”来人却反问司马颙是谁。司马颙说:“我是河间王,被封为司徒,现在奉诏去洛阳。”来人哄然大笑,跳上车,把司马颙按倒,扼住他的喉咙。司马颙的三个儿子上前相救,却被这班莽夫拳打脚踢一通,相继毙命。司马颙被扼住很久,气不能出,两手一抖,双足一伸,一命呜呼!