SunOS开机自动运行Python脚本失败,求排查遗漏配置步骤
SunOS下init.d脚本未自动启动的排查与修复步骤
以下是你遗漏的关键操作和配置要点:
脚本未遵循SunOS init.d规范
SunOS的init.d脚本必须能接收start、stop等参数,系统启动时会向rc2.d链接指向的脚本传递start参数。你的Python脚本需要添加参数处理逻辑,示例框架如下:#!/usr/bin/env python import sys import subprocess import os def start_service(): # 后台启动服务,需避免脚本挂起 subprocess.Popen( [sys.executable, "/etc/init.d/server.py", "run"], stdout=open("/var/log/server.log", "a"), stderr=subprocess.STDOUT, start_new_session=True ) def stop_service(): # 实现服务停止逻辑,例如查找并终止进程 for line in subprocess.check_output(["ps", "-ef"]).splitlines(): parts = line.split() if len(parts) > 1 and b"/etc/init.d/server.py" in parts[-1] and b"run" in parts[-1]: pid = int(parts[1]) os.kill(pid, 15) if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: {} start|stop".format(sys.argv[0])) sys.exit(1) cmd = sys.argv[1] if cmd == "start": start_service() elif cmd == "stop": stop_service() elif cmd == "run": # 这里写服务的核心运行逻辑 pass else: print("Invalid command: {}".format(cmd)) sys.exit(1)rcN.d链接命名不符合规则
SunOS中rc2.d下的S开头链接必须包含启动顺序数字(如S99server.py),系统会按数字从小到大执行启动脚本。你当前的Sserver.py没有数字,会被系统忽略。需要重新创建链接:rm /etc/rc2.d/Sserver.py ln -s /etc/init.d/server.py /etc/rc2.d/S99server.py数字可根据服务依赖调整,依赖其他服务(如网络)则用较大数字(99为最后一批启动)。
缺少正确的Shebang头
脚本开头必须添加对应Python解释器的shebang,确保系统识别执行方式:#!/usr/bin/env python或指定系统中Python的实际路径(如
#!/usr/bin/python),可通过which python命令确认路径。未手动验证脚本可执行性
重启前先手动测试脚本是否能正常启动:/etc/init.d/server.py start ps -ef | grep server.py如果手动执行失败,需排查脚本语法错误、依赖缺失或路径权限问题(确保root能访问脚本内涉及的所有资源)。
(可选)Solaris 10+推荐使用SMF服务
若你的系统是Solaris 10或更高版本,传统rc脚本已逐步被SMF(服务管理框架)取代。通过svccfg将服务注册为SMF服务,可获得自动故障恢复、状态监控等更完善的管理能力。
内容的提问来源于stack exchange,提问作者Sarath Govind
相关产品推荐
相关产品推荐

