service一直无法启动原因

本文讲述在系统启动后,出现某个service一直启动失败,init: process 'xxxservice' killing any children in process group log持续输出的问题。


问题

这几天在做启动分区挂载失败的话进行修复的对策。手动去破坏了/data分区,看看如果挂载失败,能否会通过e2fsck或者mke2fs进行修复。
在某一次debug的时候,发现串口每5s就输出尝试启动xxxservice但失败的log,类似的如下:

1
2
3
4
5
[   56.260533] (!!) init: starting 'xxxservice'
[ 56.265197] (EE) init: cannot execve('system/sbin/xxxservice'): Permission denied
[ 56.272789] (!!) init: waitpid returned pid 1202, status = 00007f00
[ 56.279094] (!!) init: process 'xxxservice', pid 1202 exited
[ 56.284598] (!!) init: process 'xxxservice' killing any children in process group

那会儿就纳闷为啥这个xxxservice老是启动不起来。后面才知道这个service在init.rc是按照这种方式启动的:

1
2
3
4
service klogd /system/usr/bin/xxxservice -s /data/xxx_log
class main
user root
group root

xxxservice里面会去尝试打开/data/xxx_log文件,但是/data分区已经被我破坏了没修复,所以打开/data/xxx_log文件会失败,进而导致整个service启动失败。
由于在init.rc中不是以oneshot选项启动的,所以xxxservice会一直尝试启动。根据上述的内容,写了以下程序进行验证。


验证程序

testservice测试程序如下:

1
2
3
4
int main(int argc, char **argv)
{
exit(-1);
}

init.rc启动testservice内容如下:

1
2
3
4
service testservice /system/sbin/testservice
class main
user root
group root

按照上述的测试程序,启动后串口会一直打印如下内容:

1
2
3
4
5
6
7
8
9
@xxx_project:/ # [   66.333603] (!!) init: starting 'testservice'
[ 66.343070] (!!) init: waitpid returned pid 1210, status = 0000ff00
[ 66.349405] (!!) init: process 'testservice', pid 1210 exited
[ 66.354909] (!!) init: process 'testservice' killing any children in process group

@xxx_project:/ # [ 71.367372] (!!) init: starting 'testservice'
[ 71.373704] (!!) init: waitpid returned pid 1212, status = 0000ff00
[ 71.380018] (!!) init: process 'testservice', pid 1212 exited
[ 71.385532] (!!) init: process 'testservice' killing any children in process group


解决办法

最最根本的解决办法是修改service的内容,保证service能够正常的启动。另外,需要修改init.rc,以oneshot的方式进行启动。因为如果其中的某个service一直无法正常启动,那么会一直尝试启动,导致它后面的service都无法启动到。

Title:service一直无法启动原因

Author:Victor Huang

Time:2019-03-17 / 16:03

Link:http://wowothink.com/c06c62b/

License: Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)