首页 > 系统相关 >创建Linux服务,轻松管理(自启动,恢复)进程

创建Linux服务,轻松管理(自启动,恢复)进程

时间:2022-11-09 23:33:49浏览次数:42  
标签:systemd code service 轻松 server apk Linux 自启动 localdomain


有这样一个场景,在一台服务器上,我们想要启动一个简单的网络文件服务器,用来提供给内网的用户下载。

这里,我们使用ruby启动一个服务

  • 使用​​ruby -run -ehttpd /home/webbuild/easy_file_server/ -p8000​​启动文件服务器
  • 使用​​ruby -run -ehttpd /home/webbuild/easy_file_server/ -p8000 &​​ 将该进程设置为后台执行
  • 为了防止挂起,我们还需要使用nohup处理。像这样​​nohup ruby -run -ehttpd /home/webbuild/easy_file_server/ -p8000 &​

如上面设置一番,基本上可以工作了。

但是还有一些问题,比如

  • 进程意外停止了,无法自动启动
  • 服务器重启,该进程也不会自动启动

那么我们有没有什么好的办法解决呢,答案是有的。就是下面介绍的使用systemd创建Linux 服务的方式解决。

创建服务Unit文件

创建一个服务文件,比如这里叫做​​vim /etc/systemd/system/apk_server.service​​(可以将apk_server替换为你希望的名称)

内容如下



[Unit]
Description=APK Server Service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/bin/env ruby -run -ehttpd /home/webbuild/easy_file_server/ -p8000

[Install]
WantedBy=multi-user.target

重点可能需要替换的有

  • Description 该服务的描述信息
  • User 填写真实的用户名称,也可以填写root不修改。
  • ExecStart 必须替换为你需要执行的命令。

基本搞定了

启动服务



systemctl start apk_server.service

停止服务



systemctl stop apk_server.service

重新启动服务



systemctl restart apk_server.service

设置开启自启动



systemctl enable apk_server.service
//执行结果
Created symlink /etc/systemd/system/multi-user.target.wants/apk_server.service → /etc/systemd/system/apk_server.service.

其他字段解释

  • StartLimitIntervalSec 启动频率限制,设置为0
  • Restart=always 当进程退出后自动重启
  • RestartSec 重启延迟时间,单位为毫秒
  • WantedBy 自动启动相关参数

查看服务状态



systemctl status apk_server.service
● apk_server.service - APK Server Service
Loaded: loaded (/etc/systemd/system/apk_server.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2019-12-xx 22:06:40 CST; 9s ago
Main PID: 17802 (ruby)
Tasks: 2 (limit: 26213)
Memory: 15.8M
CGroup: /system.slice/apk_server.service
└─17802 ruby -run -ehttpd /home/webbuild/easy_file_server/ -p8000

localhost.localdomain systemd[1]: Started APK Server Service.
localhost.localdomain env[17802]: [2019-12-xx 22:06:40] INFO WEBrick 1.4.2
localhost.localdomain env[17802]: [2019-12-xx 22:06:40] INFO ruby 2.5.3 (2018-10-18) [x86_64-linux]
localhost.localdomain env[17802]: [2019-12-xx 22:06:40] INFO WEBrick::HTTPServer#start: pid=17802 port=8000

配置更新

当我们修改了之前的service文件后,会得到的提示

Warning: The unit file, source configuration file or drop-ins of apk_server.service changed on disk. Run ‘systemctl daemon-reload’ to reload units.

所以,当我们每次修改后,都需要执行​​systemctl daemon-reload​​确保配置生效。

排查错误

查找错误信息

可以使用使用两种方法

  • 第一种是​​systemctl status​​,上面介绍的
  • 第二种是​​journalctl​

journalctl

journalctl相对提供的日志会更多一些,使用方法也很简单



journalctl -u coo_code_review.service --no-pager --reverse

对应的日志就能看到了



localhost.localdomain systemd[1]: coo_code_review.service: Failed with result 'exit-code'.
localhost.localdomain systemd[1]: coo_code_review.service: Service RestartSec=1s expired, scheduling restart.
localhost.localdomain systemd[1]: coo_code_review.service: Scheduled restart job, restart counter is at 52.
localhost.localdomain systemd[1]: Stopped Coo Code Review Service.
localhost.localdomain systemd[1]: Started Coo Code Review Service.

code=exited, status=217/USER



apk_server.service - APK Server Service
Loaded: loaded (/etc/systemd/system/apk_server.service; disabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Fri 2019-12-20 14:03:12 CST; 409ms ago
Process: 17535 ExecStart=/usr/bin/env bash /root/startApkServer.sh (code=exited, status=217/USER)
Main PID: 17535 (code=exited, status=217/USER)

通常的错误原因是上面配置中的User设置的用户名不对。更新正确即可

设置工作目录

很多是否我们的命令会是这样

  • 进入一个目录
  • 然后执行命令

但是当我们这样设置​​ExecStart=/usr/bin/env cd your_dir && ruby -run -ehttpd easy_file_server/ -p8000​​是有问题的。好在可以这样设置工作目录



[Unit]
Description=APK Server Service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
WorkingDirectory=/root/your_dir
ExecStart=/usr/bin/env ruby -run -ehttpd /home/webbuild/easy_file_server/ -p8000

[Install]
WantedBy=multi-user.target

通过增加​​WorkingDirectory=/root/your_dir​​可以解决问题。

设置环境变量



[Unit]
Description=xxxxx Service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
Environment="ANDROID_HOME=/opt/android-sdk-linux"
WorkingDirectory=/root/automan/xxx
ExecStart=/usr/bin/env bash /root/automan/xxx/gradlew run

[Install]
WantedBy=multi-user.target

使用上面的代码,我们就增加了​​ANDROID_HOME=/opt/android-sdk-linux​​这个环境变量。

如果是多个环境变量,设置多行​​Environment="ANDROID_HOME=/opt/android-sdk-linux"​​就行

203/EXEC 错误



localhost.localdomain systemd[1]: Started Coo Code Review Service.
localhost.localdomain systemd[1]: coo_code_review.service: Main process exited, code=exited, status=203/EXEC
localhost.localdomain systemd[1]: coo_code_review.service: Failed with result 'exit-code'.

解决方法,增加​​/usr/bin/env​



ExecStart=/usr/bin/env bash /root/automan/xxxxx/gradlew run

标签:systemd,code,service,轻松,server,apk,Linux,自启动,localdomain
From: https://blog.51cto.com/u_3987305/5838985

相关文章

  • Linux驱动面试相关
    1.linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000-0xFFFFFFFF),供内核使用......
  • linux 设置 网卡混杂模式
    #!/usr/bin/python#--*--coding=utf-8--*-- from scapy.all import *interface = 'wlan1'probeReqs = [] def sniffProbes(pkt):    if pkt.h......
  • 判断文件或文件夹(目录)是否存在(状态) C/C++ win/linux通用
    一、windows下使用_access()或linux下使用access()函数判断文件状态windows下使用_access()函数所在头文件:<io.h>函数原型:int_access(constchar*_Filename,int_Acces......
  • Linux操作系统之chmod命令详细用法:Linux中的Chmod命令用于更改或分配文件和目录的权限
    前言①chmod命令用于改变Linux操作系统文件或目录的访问权限。用它控制文件或目录的访问权限。②chmod命令有两种用法一种是包含字母和操作符表达式的文字设定法。一......
  • Linux命令行快捷键
     Ctrl+a跳到本行的行首,Ctrl+e则跳到页尾。Ctrl+u删除当前光标前面的文字ctrl+k-删除当前光标后面的文字Ctrl+w和Alt+d-对于当前的单词进行删除操作,w删除光标前面的单词的......
  • linux doker 修改容器内部文件的方法
    linuxdoker修改容器内部文件的方法以django启动报错作为示例来说,错误信息内容如下:File"/usr/local/lib/python3.6/site-packages/django/db/backends/mysql/operati......
  • Linux基础10 特殊权限suid, sgid, sbit; 权限属性lsattr, chattr; 进程掩码umask
    一.特殊权限:1.suid(4000) SetUID(suid):会在属主权限位的执行权限上写个s 如果该属主权限位上有执行权限,则:s (小写) 如果该属主权限位上没有执行权限,则:S (大写) 授权方式:chmo......
  • Linux的入门学习
    1:我们为什么要学习Linuxlinux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社......
  • linux - shell
    获取连接的真机或模拟器设备adbdevices进入模拟器emulator-5554环境adb-semulator-5554shelladbshell也是可以的利用adbshell命令实现自动化操作adbshelli......
  • Git_常用的Linux命令
    cd改变目录cd..回退到上一个目录,直接cd进入默认目录pwd显示当前所在的目录路径ls(ll)都是列出当前目录的所有文件,只不过ll列出的内容更为详细touch新建一个文件......