使用Screen与系统服务实现程序后台运行及开机自启

方法一:通过Screen实现后台运行(适合临时或简单场景)

1. 安装Screen工具

根据系统类型选择对应命令:

CentOS系统

yum -y install epel-release
yum -y install screen

Debian/Ubuntu系统

apt install screen

2. 创建启动脚本(以彩虹聚合DNS为例)

  1. 创建脚本文件:

    vi dns.sh
  2. i进入编辑模式,添加以下内容:

    sleep 20   # 延迟20秒启动(等待数据库就绪,无需可设为0)
    screen_name="dns"   # 定义screen会话名称
    screen -dmS $screen_name  # 后台创建screen会话
    
    # 要执行的命令(需指定完整路径)
    cmd="/vhs/kangle/ext/php74/bin/php -c /vhs/kangle/ext/php74/phpdns.ini /home/ftp/d/dns/wwwroot/think dmtask"
    
    # 向screen会话发送命令并执行
    screen -X -S $screen_name -p 0 -X stuff "$cmd"
    screen -X -S $screen_name -p 0 -X stuff '\n'  # 模拟回车执行
    screen -X -S $screen_name -p 0 -X stuff "exit"  # 执行完成后退出
  3. Esc,输入:wq!保存退出。
  4. 赋予脚本执行权限:

    chmod +x dns.sh

3. 设置开机自启动(使用cron @reboot)

  1. 编辑当前用户的crontab配置:

    crontab -e
  2. 在文件末尾添加以下内容(替换为实际脚本路径):

    @reboot sh /path/to/dns.sh
  3. 保存退出:

    • 若用vi编辑器:按Esc,输入:wq回车
    • 若用nano编辑器:按Ctrl+O保存,Ctrl+X退出
  4. 验证配置是否生效:

    crontab -l

方法二:通过系统服务实现(推荐,依赖管理更完善)

该方法由"村长"提供,可在数据库启动后自动运行程序,适合长期稳定运行。

1. 创建服务配置脚本

  1. 创建脚本文件:

    vi czdns.sh
  2. i进入编辑模式,添加以下内容:

    #!/bin/bash
    clear;
    echo '================================================================';
    echo ' 此程序仅供学习,执行请用虚拟机,一切后果与本人无关';
    echo ' 禁止使用本脚本创建违规违法网站,发现将举报';
    
    # 创建系统服务配置文件
    cat >>/lib/systemd/system/dns.service<<EOF
    [Unit]
    Description=dns server Service
    After=syslog.target network.target mysql.service  # 确保在数据库启动后运行
    
    [Service]
    Type=forking
    # 执行PHP命令(根据实际路径修改)
    ExecStart=/bin/bash -c "/vhs/kangle/ext/php74/bin/php -c /vhs/kangle/ext/php74/phpdns.ini /home/ftp/d/dns/wwwroot/think dmtask &"
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    # 创建服务链接并启用
    ln -s /lib/systemd/system/dns.service /etc/systemd/system/multi-user.target.wants/dns
    systemctl daemon-reload
    systemctl enable dns
  3. Esc,输入:wq!保存退出。

2. 执行脚本并生效

  1. 赋予脚本执行权限:

    chmod +x czdns.sh
  2. 运行脚本创建服务:

    ./czdns.sh

3. 服务管理命令(可选)

  • 启动服务:systemctl start dns
  • 停止服务:systemctl stop dns
  • 查看状态:systemctl status dns
  • 重启服务:systemctl restart dns

两种方法对比及注意事项

方法优势适用场景
Screen + cron配置简单,适合临时调试短期运行、需要随时进入会话查看输出
系统服务依赖管理完善,启动顺序可控长期运行、生产环境、需要随系统服务顺序启动

注意事项

  1. 路径需根据实际环境修改,确保PHP解释器和程序文件路径正确
  2. 延迟时间(sleep 20)需根据数据库启动速度调整
  3. cron方式中,建议使用绝对路径指定脚本位置,避免因环境变量问题导致执行失败
  4. 系统服务方式中,After=mysql.service确保程序在数据库之后启动,若使用其他数据库(如mariadb)需对应修改
  5. 可通过查看日志排查问题:

    • cron日志:grep CRON /var/log/syslog(Debian/Ubuntu)或/var/log/cron(CentOS)
    • 系统服务日志:journalctl -u dns