本文讲述在系统启动后,出现某个service一直启动失败,init: process 'xxxservice' killing any children in process group
log持续输出的问题。
问题
这几天在做启动分区挂载失败的话进行修复的对策。手动去破坏了/data
分区,看看如果挂载失败,能否会通过e2fsck
或者mke2fs
进行修复。
在某一次debug的时候,发现串口每5s就输出尝试启动xxxservice
但失败的log,类似的如下:
1 | [ 56.260533] (!!) init: starting 'xxxservice' |
那会儿就纳闷为啥这个xxxservice
老是启动不起来。后面才知道这个service在init.rc
是按照这种方式启动的:
1 | service klogd /system/usr/bin/xxxservice -s /data/xxx_log |
在xxxservice
里面会去尝试打开/data/xxx_log
文件,但是/data
分区已经被我破坏了没修复,所以打开/data/xxx_log
文件会失败,进而导致整个service启动失败。
由于在init.rc
中不是以oneshot
选项启动的,所以xxxservice
会一直尝试启动。根据上述的内容,写了以下程序进行验证。
验证程序
testservice
测试程序如下:
1 | int main(int argc, char **argv) |
init.rc
启动testservice
内容如下:
1 | service testservice /system/sbin/testservice |
按照上述的测试程序,启动后串口会一直打印如下内容:
1 | @xxx_project:/ # [ 66.333603] (!!) init: starting 'testservice' |
解决办法
最最根本的解决办法是修改service的内容,保证service能够正常的启动。另外,需要修改init.rc
,以oneshot
的方式进行启动。因为如果其中的某个service一直无法正常启动,那么会一直尝试启动,导致它后面的service都无法启动到。