You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:23:27