Linux下将普通软件启动方式做成service方式

本文以openmeeting为例,介绍如何将一个普通软件的启动方式转变为service服务,包括创建自定义的启动脚本openmeetingd,并实现start、stop、restart、status等功能。通过pid获取java进程来实现服务的停止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以这次安装的openmeeting为例:

        目录结构:/root/openmeeting_dirnary/admin.bat

                                        admin.sh 

                                        ...

                                        red5.sh

                                        red5-shutdown.bat

                                        red5-shutdown.sh

                                        ...

   如果要启动它我们普通的方式都是进入这个/root/openmeeting_dirnary/这个目录,

   执行:./red5.sh & (当然要有执行权限)

   现在我们要做的工作就是:

       将它的启动、关闭等方式做成service ..... stop|start|restart|status|restart的方式

   cd /etc/init.d/

   touch openmeetingd (我们自己起的名字,仿照一般的服务,比如httpd....)

   贴出该文件的代码,然后再细细解释:   

#start Red5 demon

start(){     #这一步没什么好说的,就是进入到目录,改权限,启动...

   echo "starting red5 ..."

   cd /root/openmeeting_binary/

   chmod 755 red5.sh

   ./red5.sh &

   echo "Red5 started successful ..."

}

#stop red5 demon

stop(){     # 在下面详细讲解 

   pid=`ps -ef|grep "java"|grep -v "grep"|awk '{print $2}'` 

   if [ "$pid" == "" ];then

      echo "No red5 pid alive ..."

   else

      echo "now , kill pid $pid ..."

      kill $pid

      echo "Red5 stopped successful ..."

   fi

}

#show the status of red5

status(){                #通过判断进程是否启动着,即pid是否存在为依据来判断状态

   pid=`ps -ef | grep "java" | grep -v "grep" | awk '{print $2}'`

   if [ "$pid" == "" ];then

      echo "red5 is stopped ..."

   else

      echo "red5 is running ..."

   fi

}

#restart red5 demo

restart(){         调用前面的函数,很简单吧...

   stop

   start

}

#execute by input command   根据输入的命令来判断应该执行什么

case "$1" in

  start)

     start

  ;;

  stop)

     stop

  ;;

  status)

     status

  ;;

  restart)

     restart

  ;;

  *)

     echo $"Usage: $0 {start|stop|status|restart}"

     exit 1

esac

 接下来我们重点讲解stop的时候执行的脚本:

     pid = `ps -ef | grep "java" | grep -v "grep" | awk '{print $2}'`   来获得进程的pid

     执行ps -ef | grep "java" 的效果图:

 

这句主要是找出red5的运行进程,这里是java,我们还可以看到第二个进程即我们刚刚执行的 grep java , 

为了只获得上面那一行的进行,即执行:

     ps -ef | grep "java" | grep -v "grep"

 

  到这里可以看到,只剩下一行了,就是我们想要的red5生存的标识

  grep 的这个 -v 的参数的意思是:显示不包含文本的所有行,就把刚才的第二行去掉了。

  

  执行:ps -ef | grep "java" | grep -v "grep" | awk '{print $2}' 

 

 

 可以看到现在只剩下一个数字了,即pid,就是我们想要得到的最终值。

  好了,接下来直接kill掉就可以了,有点暴力吧。。。

<think>我们正在讨论如何将exe文件设置为守护进程。根据前面的对话,用户已经了解了在Linux下创建守护进程的步骤,现在想知道如何将已有的exe程序设置为守护进程。注意,用户提供的引用中有Windows和Linux两种环境的例子,因此需要区分操作系统。根据引用[4]和引用[2],在Linux下,我们可以通过编写一个守护进程程序来监控目标exe(实际上在Linux下是二进制可执行文件,但用户习惯称为exe),或者使用系统工具(如systemd)来管理。而在Windows下,根据引用[1]和引用[5],可以通过编写一个监控进程(常驻进程)来启动和监控目标exe,或者将程序注册为Windows服务。因此,我们将分两个平台进行说明:1.Linux平台:-方法1:使用系统工具(如systemd)创建服务单元,将程序作为服务运行,这样系统会自动管理它(包括自动重启、日志等)。-方法2:自己编写一个守护进程,这个守护进程可以监控目标程序的运行(如检测到目标程序退出则重新启动),但这种方法不如systemd服务管理可靠。2.Windows平台:-方法1:将程序注册为Windows服务,可以使用sc命令或者工具如NSSM(Non-SuckingServiceManager)来创建服务。-方法2:编写一个监控程序(类似守护进程),循环启动目标exe,并在目标exe退出时重新启动,如引用[5]中的bat脚本。由于用户特别提到“exe文件”,通常exe是Windows下的可执行文件,但引用[4]中提到了在Linux下运行exe(可能是通过wine或者用户误称Linux可执行文件为exe),因此需要明确用户的环境。但是,用户没有明确操作系统,因此我们分别说明两种平台的方法。以下为详细步骤:#Linux平台(假设程序是Linux原生可执行文件)##方法1:使用systemd(推荐)1.创建一个systemd服务单元文件,例如:`/etc/systemd/system/myprogram.service`2.编辑该文件,内容如下:```ini[Unit]Description=MyProgramDaemon[Service]ExecStart=/path/to/your/program#替换为实际路径Restart=always#程序退出时自动重启RestartSec=10#如果失败,等待10秒后重启User=nobody#选择运行用户Group=nogroupWorkingDirectory=/path/to/workdir#可选:设置工作目录StandardOutput=syslog#输出日志到syslogStandardError=syslog[Install]WantedBy=multi-user.target```3.重新加载systemd配置:```bashsudosystemctldaemon-reload```4.启动服务:```bashsudosystemctlstartmyprogram```5.设置开机启动:```bashsudosystemctlenablemyprogram```##方法2:编写守护进程监控程序(不推荐用于生产)可以编写一个简单的bash脚本,例如:```bash#!/bin/bashwhiletrue;do/path/to/your/program#运行目标程序sleep10#如果程序退出,等待10秒后重启done```然后让这个脚本在后台运行,但这种方法不够健壮,且不方便管理。为了更符合守护进程的特性,我们可以按照之前创建守护进程的方法来写一个C程序,监控目标程序,但是这样比较复杂。#Windows平台##方法1:注册为Windows服务(推荐)可以使用Windows内置的`sc`命令,但更推荐使用第三方工具NSSM,因为它可以方便地管理任何exe作为服务。###使用NSSM1.下载NSSM:https://nssm.cc/download2.以管理员身份打开命令提示符,安装服务:```cmdnssminstall"MyServiceName"```会弹出GUI界面,设置:-Path:选择你的exe文件路径-其他选项根据需要设置(如启动目录、参数等)3.启动服务:```cmdnssmstart"MyServiceName"```###使用sc命令(需要程序支持服务控制)如果程序本身支持作为服务运行(例如它有处理服务控制命令的能力),则可以通过sc创建服务:```cmdsccreateMyServiceNamebinPath="C:\Path\To\Your\Program.exe"start=autoscstartMyServiceName```注意:很多普通exe并不支持直接作为服务运行,因为它们没有处理服务控制事件(如停止、暂停等)的代码。因此,使用NSSM是更好的选择,因为它会为普通exe包装一个服务控制程序。##方法2:编写监控程序(类似守护进程)可以编写一个批处理脚本,如引用[5]中的例子,循环检查程序是否在运行,如果不在则启动。但这种方法不能作为服务运行,而且容易受到用户注销的影响。改进:创建一个隐藏运行的后台进程(相当于守护进程),可以使用VBScript或者PowerShell脚本在后台运行一个监控循环。但这种方法不如注册服务健壮。鉴于用户需求是设置为守护进程,在Windows下最接近的就是服务。因此,推荐使用NSSM。总结:-在Linux下,使用systemd服务来守护目标程序。-在Windows下,使用NSSM将目标exe注册为服务。注意:如果Linux下的程序是Windows程序(通过wine运行),则可以在systemd的ExecStart中指定wine:ExecStart=/usr/bin/wine/path/to/program.exe最后,根据用户引用中提到的日志记录和权限问题,请确保在配置时正确设置日志输出(如systemd的日志用journalctl查看)和运行权限(如Linux下使用合适的User/Group,Windows下使用有权限的用户运行服务)。</think> ### 如何将EXE文件设置为守护进程 分平台实现方法如下,关键步骤均基于您的引用内容: #### **一、Linux系统方案** 1. **编写守护进程脚本** ```bash #!/bin/bash while true; do # 检测EXE是否运行,0表示未运行 if [ $(ps aux | grep -v grep | grep "XingCai_Temp.exe" -c) -eq 0 ]; then nohup /path/to/XingCai_Temp.exe >/dev/null 2>&1 & echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进程已重启" >> /tmp/daemon_log.txt # 引用[2] fi sleep 30 done ``` 2. **权限配置与启动** ```bash chmod +x daemon.sh # 赋予执行权限[^4] nohup ./daemon.sh > /dev/null & # 后台运行 ``` 3. **关键事项** - **日志监控**:`tail -f /tmp/daemon_log.txt` 查看实时日志[^2] - **终止方法**:`pkill -f XingCai_Temp.exe` - **权限问题**:若遇`不允许的操作`,需用`sudo`提权[^4] --- #### **二、Windows系统方案** 1. **创建批处理守护程序** (`daemon.bat`) ```bat @echo off chcp 65001 >nul :: UTF-8支持 title EXE守护进程 :RESTART tasklist /FI "IMAGENAME eq XingCai_Temp.exe" 2>nul | find /C "XingCai_Temp.exe" >nul if %errorlevel% neq 0 ( start "" "C:\path\to\XingCai_Temp.exe" :: 启动EXE echo [%date% %time%] 进程已启动 >> C:\logs\daemon.log ) :: 120秒检测一次(引用[5]逻辑) timeout /t 120 >nul goto RESTART ``` 2. **转为后台服务(推荐)** 使用NSSM工具注册服务: ```bash nssm install "MyService" C:\path\to\daemon.bat nssm start MyService ``` --- #### **三、最佳实践建议** 1. **日志管理** ```c // C语言守护进程示例(引用[1]) WriteLogFile("守护进程启动\n"); // 关键操作写日志 ``` - Linux日志目录:`/var/log/`(需root权限) - Windows日志目录:`C:\ProgramData\` 2. **防意外终止** - Linux:用`systemd`托管服务(`Restart=always`) - Windows:服务属性设为「自动恢复」 3. **资源监控** ```bash watch -n 1 "ps aux | grep XingCai" # Linux实时监控 ``` > 通过`systemd`或`Windows服务管理器`注册可显著提升稳定性[^2][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值