如何配置BusyBox Ash启动时自动执行的命令?
BusyBox Ash非登录Shell自动执行命令的正确配置方法
问题原因
非登录交互式的BusyBox Ash不会读取/etc/profile,所以你在/etc/profile里设置的ENV变量根本不会被加载,自然无法触发/.shinit的执行。
解决方案
方法一:在init脚本中直接导出ENV变量
修改你的/init脚本,在启动sh前设置并导出ENV——init进程的环境变量会被exec启动的sh完全继承:
#!/bin/sh echo "### INIT SCRIPT ###" mkdir /proc /sys /tmp mount -t proc none /proc mount -t sysfs none /sys mount -t tmpfs none /tmp echo -e "\nThis boot took $(cut -d' ' -f1 /proc/uptime) seconds\n" mknod /dev/virtual_buffer c 125 0 #ifconfig eth0 10.0.2.15 netmask 255.255.255.0 up #route add default gw 10.0.2.2 # 配置ENV变量指向你的初始化脚本 ENV=/.shinit; export ENV echo "### calling /bin/sh ###" exec /bin/sh
这样启动的sh会自动读取/.shinit中的命令,包括你用来支持Ctrl-C的setsid cttyhack sh(这条命令能让新sh成为会话领袖,解决PID1的信号处理异常问题)。
方法二:直接指定启动配置文件(部分BusyBox版本支持)
如果你的BusyBox Ash编译时启用了相关选项,可以用--rcfile参数直接指定配置文件,修改init脚本最后一行:
exec /bin/sh --rcfile /.shinit
这种方式无需依赖ENV变量,更直接。
注意事项
- 确保
/.shinit文件存在,且有执行权限:chmod +x /.shinit setsid cttyhack sh会替换当前sh进程,避免PID1的信号处理限制,是让Ctrl-C正常工作的关键- 若init环境中未设置
$HOME,务必用绝对路径指定配置文件,避免路径错误
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

