Ubuntu18.04系统使用systemd服务开机自启动.sh脚本文件失败

查询服务状态显示dead

img

start之后显示这样

img

还请各位同志帮忙解决🙏🏻🙏🏻

可以参考我的博客中多个关于ubuntu开机自启动的配置!

你的问题是这样的,因为你的启动程序使用了UI界面,然后,你希望使用system启动他。
linux系统和window系统有区别。他启动以后需要启动UI界面环境,你的linux系统在没有启动UI界面程序就已经启动了你的程序导致,你是用这个方法不能启动。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Systemd配置开机自启动,执行shell脚本中的 2.1第一个启动脚本 start.sh 内容如下 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    str=$"\n"
    echo '123456' | sudo -S nohup sh /usr/local/node/nodered.sh >/dev/null 2>&1 &
    sstr=$(echo  $str)
    echo $sstr
    echo "node-red 启动完成"
    

    此处有一个小技巧,为了解决nohup方式后台启动程序,会需要手动点一下回车的问题,在原nodered.sh上加了输出换行符的语句。(在nodered.sh中没起作用,所以放到了start.sh中。。。)


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

脚本需要以非阻塞方式运行,不能在前台运行而阻塞启动进程

从的启动日志中你的错误来看的话,是报了一个connect refused错误,意思是连接被拒绝了,那么你要打开你的脚本,看下里面有没有用到什么连接的东西。其次,就是还有一个无法解析参数的问题,看下你的脚本中是否使用了参数,语法以及参数的使用上是否存在问题。
或者你可以参考下其他的一些解决方法,比如:
Ubuntu18.04 开机自启动(需要 sudo 权限):https://www.cnblogs.com/shuiche/p/15481924.html

Ubuntu18.04开机自动运行脚本失败以及解决方法

初始版本的rc.local.service并没有[Install]段,需要添加

[Install]  
WantedBy=multi-user.target  
Alias=rc-local.service
 参考[2],在/etc/目录下创建rc.local

sudo vim /etc/rc.local

以下回答来自GPT生成,请参考:
根据你提供的信息,运行自定义脚本时遇到了问题。错误日志显示了以下信息:

Loaded: loaded (/etc/systemd/system/auto_fly.service; enabled; vendor preset: enabled)
Active: failed (Result: exitcode) since Thu 2023-07-06 17:33:30 CST; 25s ago
Process: 3640 ExecStart=/home/abc235/catkin ws/auto mission -sitl.sh (code=exited, status=1/FAILURE)
Main PID: 3640 (code=exited, status=1/FAILURE)

无法初始化服务器: 无法连接: 连接被拒绝

Failed to parse arguments: Cannot open display:

启动Python节点...
无法初始化服务器: 无法连接: 连接被拒绝

Failed to parse arguments: Cannot open display:

Starting sitl.launch..
auto fly.service: Main process exited, code=exited, status=1/FAILURE
auto fly.service: Failed with result 'exit-code'.

根据这些信息,可以看出脚本无法连接到服务器,并且在解析参数和初始化服务器时遇到了问题。这可能是由于服务器连接被拒绝或无法打开显示导致的。可能的解决方法包括:

  1. 检查服务器连接:确保服务器连接正确并且允许脚本连接。检查网络设置、防火墙和其他相关配置。

  2. 检查显示设置:如果脚本需要使用显示,请确保显示正确配置并且可以连接。你可以尝试使用远程桌面工具连接到服务器并检查显示设置。

  3. 查看脚本参数:检查脚本参数是否正确,并确保脚本可以正确解析和处理这些参数。

如果问题仍然存在,你可能需要更详细地检查脚本和服务器配置以解决问题。

创建服务文件:在 /etc/systemd/system/ 目录下创建一个以 .service 结尾的服务文件,例如 your_service_name.service。

编辑服务文件:使用文本编辑器打开服务文件,并确保包含以下内容:
Unit]
Description=Your Service Description
After=network.target

[Service]
ExecStart=/path/to/your_script.sh
WorkingDirectory=/path/to/working_directory
User=username
Group=groupname
Type=simple
Restart=always

[Install]
WantedBy=default.target

确保将 Your Service Description 替换为对服务的简短描述,/path/to/your_script.sh 替换为您实际的脚本文件路径,/path/to/working_directory 替换为脚本文件的工作目录,username 和 groupname 替换为脚本文件所属的用户和组。
保存并关闭服务文件。

启用服务:在终端中运行以下命令启用您创建的服务:
sudo systemctl start your_service_name.service
确保没有报错并且服务正常启动。

验证状态:您可以使用以下命令来验证服务的状态:
sudo systemctl status your_service_name.service

这将显示服务的当前状态和任何错误消息。

如果您按照上述步骤进行操作仍然无法实现开机自启动,请检查脚本文件的权限和路径是否正确,并确保脚本文件本身能够正常运行。

如果问题仍然存在,您可以查看系统日志以获取更多关于服务启动失败的详细信息。使用命令 journalctl -u your_service_name.service 查看服务的日志。

请注意,以上步骤仅适用于使用 systemd 作为 init 系统的 Ubuntu 18.04 系统。如果您使用的是其他版本或不同的 init 系统,请参考相应的文档或支持资源进行操作。

错误的服务配置文件:请确保你的服务配置文件(通常位于/etc/systemd/system/目录下,以.service为扩展名)正确配置。检查以下几点:

ExecStart行是否指定了正确的脚本路径和参数。
WorkingDirectory行是否设置了正确的工作目录。
User和Group行是否设置为具有适当权限的用户和组。
其他配置项是否正确设置。
脚本文件权限问题:请确保你的.sh脚本文件具有可执行权限。可以使用chmod命令为脚本文件添加执行权限,例如:chmod +x script.sh。

脚本文件路径问题:确认你在服务配置文件中指定的脚本路径是正确的,并且脚本文件确实存在于该路径下。

依赖问题:如果你的脚本依赖于其他服务或资源,确保这些依赖项在系统启动时可用。你可以使用Requires和After等选项来定义依赖关系。

错误日志查看:检查系统日志以获取更多信息。使用journalctl命令可以查看systemd服务的日志。例如:journalctl -u your_service_name。

重新加载和启动服务:如果你对服务配置文件进行了更改,请使用systemctl命令重新加载配置并启动服务。例如:sudo systemctl daemon-reload和sudo systemctl start your_service_name。

以下答案参考newbing,回答由博主波罗歌编写:
您好,根据您的描述,可能有几种原因导致服务启动失败并显示为"dead"状态的问题。

  1. 路径问题:请确保.sh脚本文件的路径正确,并且脚本文件有可执行权限。您可以通过ls -l命令查看文件的权限,使用chmod +x命令给文件添加可执行权限。

  2. 依赖问题:如果您的脚本文件依赖于其他程序或库文件,请确保这些依赖已经正确安装,并且能够在启动时被找到。

  3. 脚本问题:请确保脚本文件本身没有错误。您可以手动尝试运行脚本文件并检查输出结果。您还可以尝试修改脚本文件的权限为可读可写(chmod 755 script.sh),然后使用./script.sh命令运行脚本,确保它正常工作。

关于使用systemd服务开机自启动.sh脚本文件的步骤如下:

  1. 创建一个以.service为后缀的文件,比如myservice.service,并将以下内容复制到该文件中:
[Unit]
Description=My Service
After=network.target

[Service]
ExecStart=/path/to/your/script.sh
Restart=always

[Install]
WantedBy=multi-user.target
  1. 将该文件拷贝到/etc/systemd/system/目录下。

  2. 运行以下命令设置服务开机自启动并启动服务:

sudo systemctl enable myservice
sudo systemctl start myservice
  1. 您可以通过运行sudo systemctl status myservice命令查看服务状态。

请确保将上述代码中的/path/to/your/script.sh替换为您的脚本文件的实际路径。

希望以上方法可以帮助您解决问题。如果还有其他问题,请随时提问。
如果我的回答解决了您的问题,请采纳!