Linux服务创建故障排查:随机数脚本启动失败求助
分析你的Linux服务启动失败问题
首先,先拆解你遇到的错误提示:Active: failed (Result:exit--code) ExecStart=/usr/local/bin/service.sh --option=start (code=exited, status=203/EXEC)——这个错误通常意味着systemd无法正常执行你的脚本,要么是脚本缺少执行权限,要么是脚本内部存在命令语法或逻辑错误。结合你的代码来看,最核心的问题出在start函数里的shuf命令上:
主要错误点
shuf不支持--pidfile参数:你在shuf -i 30-60 -n 1 --pidfile = /tmp/randn.pid这行里用了--pidfile,但shuf是用来生成随机序列的工具,根本没有这个参数!这会直接导致命令执行失败,进而让整个start函数异常退出,服务启动失败。- 参数语法错误:即便某个命令支持
--pidfile,=两边也不能加空格,正确写法是--pidfile=/tmp/randn.pid,不过这在当前问题里是次要的,因为shuf本身不支持该参数。 - 脚本权限缺失:要确保你的
script.sh(也就是systemd配置里的/usr/local/bin/service.sh)已经赋予执行权限,执行chmod +x /usr/local/bin/service.sh即可。
修正后的脚本示例
如果你的需求是启动服务时生成30-60的随机数,同时记录服务PID(注意:shuf是一次性命令,执行完就会退出;如果需要服务持续运行,得额外加循环逻辑,下面先基于你的现有需求修正):
#!/bin/bash # 先执行:chmod +x /usr/local/bin/service.sh 赋予执行权限 function start() { # 生成随机数并输出 random_num=$(shuf -i 30-60 -n 1) echo "Generated random number: $random_num" # 记录当前服务脚本的PID(shuf执行完就终止,所以记录脚本自身PID更合理) echo $$ > /tmp/randn.pid echo "Service PID is $(cat /tmp/randn.pid)" } function stop() { if [ -f /tmp/randn.pid ]; then pid=$(cat /tmp/randn.pid) echo "Randn: Stopping Service (PID = $pid)" # 先检查PID对应的进程是否存在,再执行杀死操作 if ps -p $pid > /dev/null 2>&1; then kill $pid fi rm /tmp/randn.pid else echo "Randn service is not running" fi } function status() { if [ -f /tmp/randn.pid ]; then pid=$(cat /tmp/randn.pid) if ps -p $pid > /dev/null 2>&1; then echo "Randn service is running (PID: $pid)" else echo "Randn service PID file exists but process is not running" fi else echo "Randn service is not running" fi } # 处理锁文件,避免服务重复启动 LOCK_FILE="/var/lock/randn" if [ "$1" = "start" ]; then if [ -f $LOCK_FILE ]; then echo "Randn service is already running" exit 1 fi touch $LOCK_FILE fi case "$1" in start) start ;; stop) stop rm -f $LOCK_FILE ;; reload) stop sleep 1 start ;; status) status ;; *) echo "Usage: $0 {start|stop|reload|status}" exit 1 ;; esac exit 0
额外补充(如果需要服务持续运行)
如果你的需求是让服务后台持续生成随机数(比如每隔一分钟生成一次),可以修改start函数为循环逻辑:
function start() { echo $$ > /tmp/randn.pid echo "Service PID is $(cat /tmp/randn.pid)" # 循环生成随机数,每隔60秒执行一次 while true; do random_num=$(shuf -i 30-60 -n 1) echo "$(date): Generated random number: $random_num" >> /var/log/randn.log sleep 60 done }
同时,你的randn.service配置里可以指定Type=simple,并添加日志相关配置,让输出更规范。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

