在Linux服务器上怎样同时运行多个代码实例?

在Linux服务器上同时运行多个代码实例有多种方法,以下是常见方案:

一、基础方法

1. 后台运行

# 使用 & 符号
python script.py &
node app.js &

# 查看后台任务
jobs

# 带回终端
fg %1

# 脱离终端运行(nohup)
nohup python script.py > output.log 2>&1 &

2. 使用 screen/tmux

# screen
screen -S mysession
# 运行程序后按 Ctrl+A D 分离
screen -r mysession  # 重新连接

# tmux(更现代)
tmux new -s mysession
# 运行程序后按 Ctrl+B D 分离
tmux attach -t mysession

二、进程管理工具

1. systemd(系统服务)

# /etc/systemd/system/myapp.service
[Unit]
Description=My Application

[Service]
Type=simple
ExecStart=/usr/bin/python3 /path/to/app.py
Restart=always
User=myuser

[Install]
WantedBy=multi-user.target
sudo systemctl start myapp
sudo systemctl enable myapp

2. Supervisor

# /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=python3 app.py
directory=/path/to/app
autostart=true
autorestart=true
user=myuser
numprocs=4  # 启动4个实例
process_name=%(program_name)s_%(process_num)02d

3. PM2(Node.js专用)

npm install -g pm2
pm2 start app.js -i 4  # 启动4个实例
pm2 list
pm2 monit

三、容器化方案

1. Docker Compose

version: '3'
services:
  app1:
    image: myapp:latest
    restart: always

  app2:
    image: myapp:latest
    restart: always

2. Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3  # 3个实例
  template:
    spec:
      containers:
      - name: myapp
        image: myapp:latest

四、高级方案

1. 负载均衡多实例

# 使用Nginx反向XX
upstream app_servers {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

server {
    location / {
        proxy_pass http://app_servers;
    }
}

2. 并行启动脚本

#!/bin/bash
# start_multiple.sh
for i in {1..5}; do
    PORT=$((8000 + i))
    python app.py --port=$PORT &
    echo "启动实例 $i,端口 $PORT"
done

# 等待所有进程
wait

五、最佳实践建议

  1. 根据需求选择工具

    • 简单测试:&screen
    • 生产环境:systemdsupervisor
    • 微服务架构:Docker/Kubernetes
  2. 资源管理

    # 使用taskset绑定CPU核心
    taskset -c 0,1 python app.py &
    
    # 使用nice调整优先级
    nice -n 10 python low_priority.py &
  3. 监控和管理

    # 查看所有实例
    ps aux | grep app.py
    
    # 查看资源使用
    htop
    pidstat -p <PID>
  4. 日志分离

    # 每个实例独立日志
    python app.py --port=8000 > app_8000.log 2>&1 &
    python app.py --port=8001 > app_8001.log 2>&1 &

选择哪种方案取决于你的具体需求:实例数量、是否需要持久运行、是否需要自动重启、以及运维复杂度要求。

云服务器