Linux写sh开机启动脚本-bash报错的两种解决方法

最近写了个Linux开机自启动Java程序的脚本,后面更新版本时需要停止觉得太麻烦,于是又写了个stop脚本,结果运行的时候报错:Permission denied

root@\]# ./stop.sh -bash: ./stop.sh: Permission denied

这里是权限不够的错误,所以我们执行一下这个命令就可以了

复制代码
chmod +x stop.sh

紧接着再运行,又出现了一个错误。

root@\]# ./stop.sh -bash: ./stop.sh: 无法执行:找不到需要的文件

这个错误其实我在写start的时候就遇到了,只是脑子不好用了,才过了几天就忘了这回事而已。

根据找到资料的原因,是因为在windows环境下写的sh脚本格式在linux环境下不支持。

解决办法1

第1个解决方法,是我当时写start.sh的时候使用的,我们主要是使用vim编辑。

bash 复制代码
vim start.sh

我们不用按i进入编辑,直接在这个模式按冒号,输入以下:

bash 复制代码
set ff=unix

Esc + :set ff=unix

最后再使用wq保存退出,再次运行就成功了。

解决办法2

以下是本次编辑stop.sh的时候用到的第2种办法。

报错-bash: ./stop.sh: /bin/bash^M: bad interpreter: No such file or directory

作者提到,这个错误通常出现在 Windows 换行符(CRLF)与 Linux/Unix 换行符(LF)之间的不匹配导致的。在 Unix/Linux 系统中,换行符只是 LF(\n),而在 Windows 中,换行符是 CRLF(\r\n)。

解决方法之一是使用 dos2unix 命令将脚本文件的换行符转换为 Unix 格式。你可以在终端中运行以下命令:

复制代码
dos2unix stop.sh

如果没办法安装的话,你可以尝试使用 sed 命令来替换文件中的换行符

复制代码
sed -i 's/\r$//' stop.sh

那么最后我说执行了dos2unix 这里命令,stop.sh就可以正常执行了,感觉要比第1种方法快捷一点。

jar包自启动脚本

start.sh

既然都专门写一篇博客了,就顺便把两个脚本一起放上来,也是方便日后学习回顾。

bash 复制代码
#!/bin/bash

JAR_PATH=/usr/projectName/java-1.0-SNAPSHOT-exec.jar

echo "Checking $JAR_PATH..."

if [ ! -f "$JAR_PATH" ]; then
    echo "Error: $JAR_PATH does not exist."
    echo "Listing directory contents:"
    ls -l $(dirname "$JAR_PATH")
    exit 1
fi

# 检查jar文件是否存在
if [ ! -f "$JAR_PATH" ]; then
    echo "Error: $JAR_PATH does not exist."
    exit 1
fi

# 检查是否有读取权限
if [ ! -r "$JAR_PATH" ]; then
    echo "Error: No read permission for $JAR_PATH."
    exit 1
fi

# 如果一切正常,运行jar文件
nohup java -jar $JAR_PATH > /usr/projectName/app.log 2>&1 &

stop.sh

bash 复制代码
server_name=QuoteServer
echo ******stop $server_name begin******
#find the pid of server_name
str=$(ps -ef|grep $server_name|grep -v "grep"|awk '{printf$2}')
kill -9 $str
if [ "$?" -eq 0 ];then
  echo kill $server_name Success,pid=$str
else
  echo kill $server_name Failed,pid="$str
fi
echo ******stop $server_name end******

自启动配置

首先,编辑配置文件

bash 复制代码
vim /etc/profile

在配置文件最后,加入start.sh的路径,再保存退出

bash 复制代码
sh /usr/projectName/start.sh

最后,执行以下以下命令,就能立马生效了。

bash 复制代码
source /etc/profile

参考链接:

https://blog.csdn.net/qq_28822933/article/details/102934915

https://blog.csdn.net/weixin_44928129/article/details/138698737

https://blog.csdn.net/tg928600774/article/details/153690825

相关推荐
小糖学代码4 分钟前
LLM系列:1.python入门:6.元组型对象(tuple)
linux·运维·服务器·python
那个失眠的夜6 分钟前
Spring 的纯注解配置
xml·java·数据库·后端·spring·junit
ffqws_11 分钟前
Spring Boot:用JWT令牌和拦截器实现登录认证(含测试过程和关键注解讲解)
java·spring boot·后端
小兔崽子去哪了25 分钟前
华为 IODT 设备接入
java·华为
摇滚侠28 分钟前
Groovy 如何给集合中添加元素
java·开发语言·windows·python
云淡风轻~窗明几净34 分钟前
ubuntu的lazarus的Tline/TeaLine组件的构思
linux·数据库·ubuntu
小宋00135 分钟前
ROS2 安装指南(Ubuntu 22.04+Humble)
linux·运维·ubuntu
无巧不成书021843 分钟前
Java异常体系与处理全解:核心原理、实战用法、避坑指南
java·开发语言·异常处理·java异常处理体系
8Qi81 小时前
RabbitMQ高级篇:消息可靠性、幂等性与延迟消息
java·分布式·微服务·中间件·rabbitmq·springcloud
yxl_num1 小时前
Docker 完整部署一个包含 Spring Boot(依赖 JDK)、MySQL、Redis、Nginx 的整套服务
java·spring boot·docker