两套食安软件清单与运维命令速查

现场基线:2026-10-23,麒麟新服务器10.10.235.2。本表按软件/工具用途共列13项:5项核心服务/运行组件、3项Node管理工具、5项系统辅助工具。不是13次独立安装;达梦由厂家安装,部分系统工具原来就有。程序包内的dmdb、NestJS、Express、mqtt等依赖不另计系统软件。

**本页是命令参考,不是让你依次全部执行。**当前两套正常运行;用户要求等两套前厅迁完再安排停止、重启和恢复演练。所有启停命令只在批准维护窗口按目标选择执行,本次整理没有操作服务器。

1. 软件清单、位置和用途

序号 软件/工具 已核实版本 安装/使用位置 作用与检查
1 达梦数据库 DM8.4 Pack30 /home/dmdba/dmdbms;工具bin/disql;服务DmServiceDMS 两套共用实例,用不同模式隔离;systemctl status DmServiceDMS --no-pager -l
2 Nginx 1.21.5 /usr/sbin/nginx;主配置/etc/nginx/nginx.conf;站点/etc/nginx/conf.d 静态前端与API反向代理;nginx -t
3 Mosquitto Broker 实际运行2.0.18 /opt/foodsafe-mosquitto/2.0.18/sbin/mosquitto;配置/etc/mosquitto/mosquitto.conf 两套共用MQTT1883;systemctl status mosquitto --no-pager -l
4 Node.js 20.19.5 /var/lib/foodsafe/.nvm/versions/node/v20.19.5;统一入口/opt/foodsafe-node/bin/node 执行后端;/opt/foodsafe-node/bin/node -v;无独立node系统服务
5 PM2 6.0.13 Node目录/lib/node_modules/pm2;入口/opt/foodsafe-node/bin/pm2;数据/var/lib/foodsafe/.pm2 管理foodsafe-1/foodsafe-2;用下文fpm2操作
6 nvm 0.40.3 /var/lib/foodsafe/.nvm foodsafe用户的Node版本管理器,是Shell函数,不是常驻服务
7 npm 随Node安装,未单独冻结版本 /opt/foodsafe-node/bin/npm(对应所选Node目录) Node包管理;/opt/foodsafe-node/bin/npm -v;不需要单独启停
8 pnpm 10.21.0 /opt/foodsafe-node/bin/pnpm;实际全局包位置用readlink或npm root -g核对 构建/依赖工具;/opt/foodsafe-node/bin/pnpm -v;当前dist运行不用现场pnpm install
9 Python 3.7.9 /usr/bin/python3 迁移验收和清理脚本;python3 --version;无独立服务
10 rsync 3.1.3 /usr/bin/rsync 文件迁移与只读校验;rsync --version;本次经SSH使用,不依赖rsync daemon
11 curl 未单独记录版本 /usr/bin/curl HTTP健康检查;curl --version;无独立服务
12 logrotate 已确认存在,现场版本待查 /usr/sbin/logrotate;本任务配置/usr/local/lib/foodsafe-maintenance/foodsafe-logrotate.conf 活动日志归档;logrotate --version;本任务由cron调用,不另建服务
13 crond/crontab 已确认命令存在且crond active /usr/bin/crontab;服务crond,真实启动路径用systemctl show查询 定时任务调度;crontab -l及systemctl status crond --no-pager

Mosquitto还有新机RPM安装的1.6.15及/usr/sbin/mosquitto,但当前systemd已改用独立2.0.18。不要只运行PATH里的mosquitto -h就认定服务版本;要看systemctl的ExecStart。认证文件/etc/mosquitto/passwd属主mosquitto:mosquitto、0600,不能公开内容。

达梦原实例数据目录尚未完整核实;/data/dmdata/foodsafe和/data/dmdata/foodsafe2只是本次业务表空间目录,不能把它们当作全库文件或完整备份范围。

驱动dmdb1.0.52452是每套后端node_modules中的程序依赖,不需要另启动服务,不是PHP扩展。精确加载路径可用下文命令查看,不手工覆盖或在线升级它。

2. 两套应用、配置、数据和入口

项目 第一套 第二套
应用目录 /data/apps/foodsafe1 /data/apps/foodsafe2
PM2名称 foodsafe-1 foodsafe-2
学校端 http://10.10.235.2:4201 http://10.10.235.2:4202
监管端 4301 4302
大屏 5209 5210
手机端 4211 4212
本机后端 127.0.0.1:3300 127.0.0.1:3301
数据库用户/模式 FOODSAFE_APP FOODSAFE2_APP
表空间 FOODSAFE_TBS FOODSAFE2_TBS
私有配置 APP_ROOT/services/gateway-service/.env 同结构,使用第二套APP_ROOT
PM2配置 APP_ROOT/deploy/ecosystem.config.cjs 同结构
正式Nginx站点 /etc/nginx/conf.d/foodsafe-release-1.conf /etc/nginx/conf.d/foodsafe-release-2.conf
普通图片 APP_ROOT/data/uploads 同结构
AI文件 APP_ROOT/aiboxfile 同结构
日志 APP_ROOT/logs/out-0.log、error-0.log APP_ROOT/logs/out-1.log、error-1.log

日志数字后缀可能随以后重新建进程而变化,使用fpm2 describe核实,不因旧文件没有新行就删除日志。两个后台都由foodsafe用户管理;Web前端由Nginx直接读取dist,没有另一个Vite/开发服务器需要启动。

3. 每次登录root后先定义PM2便捷命令

以下在新服务器root的Bash终端执行一次;只定义函数,不启动/停止应用。函数只在当前终端有效,重新登录需重新定义。它固定foodsafe用户、HOME、PM2_HOME与PATH,避免误用root的PM2。

fpm2() {
  (
    cd /var/lib/foodsafe || exit 1
    runuser -u foodsafe -- env \
      HOME=/var/lib/foodsafe \
      PM2_HOME=/var/lib/foodsafe/.pm2 \
      PATH=/opt/foodsafe-node/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
      /opt/foodsafe-node/bin/pm2 "$@"
  )
}

日常不要直接在root下执行裸pm2、pm2 kill、pm2 delete all。PM2在daemon不存在时,部分查询命令也可能创建管理daemon;若正排查systemd启动失败,先看systemctl/journalctl,不反复混用手动PM2与systemd启动。

4. 两套应用启动、停止、重启及日志

下面各行是独立操作,根据需要选择,不要把整张表的启停动作依次执行。stop停止指定后端但保留PM2定义;restart可恢复已停止的已登记进程或重启正在运行的进程。相关行为依据PM2官方进程管理文档。

目的 第一套命令 第二套命令
查看两套状态 fpm2 list 同一列表
查看单套详细信息 fpm2 describe foodsafe-1 fpm2 describe foodsafe-2
停止指定后端(维护窗口) fpm2 stop foodsafe-1 fpm2 stop foodsafe-2
重启/恢复已登记的后端(维护窗口) fpm2 restart foodsafe-1 fpm2 restart foodsafe-2
最近80行日志后退出 fpm2 logs foodsafe-1 --lines 80 --nostream fpm2 logs foodsafe-2 --lines 80 --nostream
实时看日志 fpm2 logs foodsafe-1 --lines 30 fpm2 logs foodsafe-2 --lines 30

实时日志按Ctrl+C只退出查看,不停止后端。停止后端后,Nginx可能仍显示页面框架,但登录、API及设备上报不可用;这不是“停止整台服务器”。一套停止不等于另一套停止。

仅当fpm2 list确认对应进程不存在,并已检查端口空闲/配置正确时,才按已有配置重新登记。普通恢复使用上表restart,不重复安装制品或运行activate.sh。

# 二选一,仅重新登记确实缺失的对应实例
fpm2 start /data/apps/foodsafe1/deploy/ecosystem.config.cjs
fpm2 start /data/apps/foodsafe2/deploy/ecosystem.config.cjs

修改磁盘.env后,指定后端重启会重新读取它;不要用source执行.env。若需要变更PM2进程环境,核对ecosystem及是否有覆盖变量后按PM2文档使用--update-env,不能把root临时环境直接灌入进程。更改.env或启动环境前备份,仅修改需要的套别。

确认两套目标状态都为online、配置正确后保存当前进程列表:

fpm2 save

save会保存该用户的整个PM2列表,不要在一套临时stopped时随手save,以免把临时维护状态带入恢复列表。Node/PM2升级会改变实际路径,需要重新核验startup服务,不能随意nvm切版本后就认为开机恢复仍有效。

5. 每次变更后的健康检查

for PORT in 4201 4202; do
  curl --noproxy '*' -sS --connect-timeout 3 --max-time 10 \
    -o /dev/null -w "学校端 $PORT:HTTP %{http_code}\n" \
    "http://127.0.0.1:$PORT/api/health"
done
for PORT in 4201 4301 5209 4211 4202 4302 5210 4212; do
  curl --noproxy '*' -sS --connect-timeout 3 --max-time 10 \
    -o /dev/null -w "页面 $PORT:HTTP %{http_code}\n" \
    "http://127.0.0.1:$PORT/"
done

HTTP200仅代表入口可达;再看受影响页面、请求正文、图片和设备新上报,不能只用/health判定所有业务恢复。

6. 共享服务的运维命令

这些服务是共享基础设施,停止或重启会影响多套系统。下面是维护参考,当前不执行停止/重启。

软件 状态查询 启动 停止 重启 影响
Nginx systemctl status nginx --no-pager -l systemctl start nginx systemctl stop nginx systemctl restart nginx 所有由该Nginx托管的食安及以后前厅入口
Mosquitto systemctl status mosquitto --no-pager -l systemctl start mosquitto systemctl stop mosquitto systemctl restart mosquitto 两套共用Broker的设备连接和消息
达梦 systemctl status DmServiceDMS --no-pager -l systemctl start DmServiceDMS systemctl stop DmServiceDMS systemctl restart DmServiceDMS 同一实例下所有数据库用户,含两套食安及以后同实例前厅
crond systemctl status crond --no-pager -l systemctl start crond systemctl stop crond systemctl restart crond 全机cron任务,包括存储监控;正常改crontab不需要重启

Nginx配置变更一般先语法检查再重载,不必完整restart。检查失败不继续重载:

nginx -t && systemctl reload nginx

以上也会影响共享入口,只在审核变更后执行。不要覆盖整个nginx.conf或移动全部conf.d文件。部署第二套必须用其独立站点配置。

服务日志:

journalctl -u nginx -n 60 --no-pager
journalctl -u mosquitto -n 60 --no-pager
journalctl -u DmServiceDMS -n 60 --no-pager
journalctl -u crond -n 60 --no-pager

达梦内部错误/归档/备份日志位置由厂家原实例配置确定,不能假设全部在journalctl。需要数据库操作时以厂家DBA运维流程为准,不用文件复制代替一致性备份。

7. PM2开机服务:与单套应用启停区分

pm2-foodsafe共管foodsafe用户已保存的进程列表,不是某一套专用服务。已注册并enabled;最后回传MainPID=0、inactive,而两套手动PM2均online。这不是食安已停止,也不是开机恢复实测完成。

只读检查:

systemctl show pm2-foodsafe --no-pager -p ActiveState -p UnitFileState -p MainPID
systemctl cat pm2-foodsafe --no-pager
journalctl -u pm2-foodsafe -n 60 --no-pager

service位于/etc/systemd/system/pm2-foodsafe.service,User=foodsafe,PM2_HOME=/var/lib/foodsafe/.pm2,PIDFile同目录pm2.pid;ExecStart是已安装PM2的resurrect。其ExecStop会kill该用户整个PM2 daemon,接管后会影响两套。

systemctl start/stop/restart pm2-foodsafe属于整组进程恢复/停止,不能替代单套fpm2命令。当前手动daemon仍运行,不直接启动第二个恢复流程。等前厅都迁完,在统一维护窗口核对保存列表、处理手动daemon与systemd接管、验证恢复;不要自行重启整机。

开机启用情况查询:

for SERVICE in nginx mosquitto pm2-foodsafe DmServiceDMS crond; do
  echo "===== $SERVICE ====="
  systemctl is-enabled "$SERVICE"
done

已验证nginx、mosquitto、pm2-foodsafe、DmServiceDMS为enabled,crond此前只确认active,是否enabled以查询为准,不预先声称已验证。

8. 工具版本和实际安装路径查询

/opt/foodsafe-node/bin/node -v
/opt/foodsafe-node/bin/npm -v
/opt/foodsafe-node/bin/pnpm -v
python3 --version
rsync --version | head -n 1
curl --version | head -n 1
logrotate --version

nvm需要在正确用户下加载:

runuser -u foodsafe -- env HOME=/var/lib/foodsafe /bin/bash -c \
  '. /var/lib/foodsafe/.nvm/nvm.sh && nvm --version'

查看Node工具真实链接及全局包位置(查询,不安装):

readlink -f /opt/foodsafe-node/bin/node
readlink -f /opt/foodsafe-node/bin/pnpm
readlink -f /opt/foodsafe-node/bin/pm2
runuser -u foodsafe -- env HOME=/var/lib/foodsafe PATH=/opt/foodsafe-node/bin:/usr/bin:/bin /opt/foodsafe-node/bin/npm root -g

查看实际运行的MQTT程序与cron启动命令:

systemctl show mosquitto --no-pager -p ExecStart -p User -p Group
systemctl show crond --no-pager -p ExecStart -p FragmentPath
/opt/foodsafe-mosquitto/2.0.18/sbin/mosquitto -h

查看两套依赖实际加载位置,不打印连接配置:

/opt/foodsafe-node/bin/node <<'JS'
const { createRequire } = require('node:module');
for (const root of ['/data/apps/foodsafe1', '/data/apps/foodsafe2']) {
  const req = createRequire(root + '/services/gateway-service/package.json');
  console.log(root);
  for (const name of ['dmdb', 'mqtt', 'dotenv', '@nestjs/core', 'express']) {
    console.log(name + ': ' + req.resolve(name));
  }
}
JS

9. 定时清理和日志轮转运维

脚本目录/usr/local/lib/foodsafe-maintenance;不是常驻服务,不需要systemctl启动。唯一食安root cron每日02:30调用cleanup.py --apply,普通uploads不纳入。配置只在本目录使用,不重复放到/etc/logrotate.d。

目的 命令 是否改变现场
查看定时任务 crontab -l 否
修改定时任务 crontab -e 是,先备份原内容;保留两条storcli_monitor
只预览候选 /usr/bin/python3 /usr/local/lib/foodsafe-maintenance/cleanup.py 不删除、不轮转
查看最近运行结果 tail -n 60 /var/log/foodsafe-maintenance-last.log 否
手动实际清理 /usr/bin/python3 /usr/local/lib/foodsafe-maintenance/cleanup.py --apply 是,会删除过期AI文件、轮转日志及删除过期归档;不作普通巡检

停用清理只需crontab -e注释该条30 2任务,其他cron保留,不停止全机crond。首次实际运行还未验收,debug里“already rotated”是模拟状态,不代表客户日志真的轮转过。

10. 简明运维顺序与参考

  1. 明确操作新服务器、第一套还是第二套。
  2. 查PM2、健康接口、对应错误日志,先定位再改。
  3. 配置变更前备份具体文件;不得输出私有.env或密码。
  4. 按维护窗口只操作必要的单套或共享服务。
  5. 回读进程/接口、打开受影响业务页面、核对设备新上报。
  6. 两套目标运行状态正常后再save,并把变更和证据补入运维总记录。

完整现场配置、备份路径、故障修复、用户接受的历史缺失和待办见同目录foodsafe-operations.md/HTML。本页不涉及安装PHP或MySQL,它们不属于本次新机食安运行依赖;前厅软件清单另行维护。

PM2命令行为参考官方文档:进程管理、启动恢复。现场路径与版本以用户实际回传为准;没有执行本页任何停止或重启命令。