文章目录

      • 一、创建test1-test10用户(跳过已存在的test3)
      • 二、检查必要组件是否安装
      • 解决方法:用紧凑格式避免换行解析错误
      • 核心修复说明:
      • 使用方法:

以下是根据需求生成的命令、检查脚本及启动脚本,按步骤执行即可:

一、创建test1-test10用户(跳过已存在的test3)

# 循环创建用户,若用户已存在则跳过
for U in test1 test2 test3 test4 test5 test6 test7 test8 test9 test10; doif ! id "$U" &>/dev/null; then# 用户不存在时创建,家目录自动生成,默认shell为bashuseradd -m -s /bin/bash "$U"# 为新用户设置密码(可根据需要修改密码)echo "$U:StrongPassword123" | chpasswdecho "用户 $U 创建完成"elseecho "用户 $U 已存在,跳过创建"fi
done

二、检查必要组件是否安装

创建检查脚本 check_dependencies.sh,用于验证 code-serverjupyterlabjupyter-server-proxy 是否安装:

#!/bin/bash# 检查code-server是否安装
if command -v code-server &>/dev/null; thenecho "✅ code-server 已安装,版本:$(code-server --version | head -n1)"
elseecho "❌ code-server 未安装,请先执行安装命令:curl -fsSL https://code-server.dev/install.sh | sh"
fi# 检查jupyterlab是否安装
if command -v jupyter &>/dev/null && jupyter lab --version &>/dev/null; thenecho "✅ JupyterLab 已安装,版本:$(jupyter lab --version)"
elseecho "❌ JupyterLab 未安装,请先执行安装命令:pip install jupyterlab"
fi# 检查jupyter-server-proxy是否安装
if pip show jupyter-server-proxy &>/dev/null; thenecho "✅ jupyter-server-proxy 已安装,版本:$(pip show jupyter-server-proxy | grep Version | awk '{print $2}')"
elseecho "❌ jupyter-server-proxy 未安装,请先执行安装命令:pip install jupyter-server-proxy"
fi# 检查jupyter-server-proxy扩展是否启用
if jupyter server extension list 2>/dev/null | grep -q "jupyter_server_proxy.*enabled"; thenecho "✅ jupyter-server-proxy 扩展已启用"
elseecho "❌ jupyter-server-proxy 扩展未启用,请执行:jupyter server extension enable --sys-prefix jupyter_server_proxy"
fi

执行检查脚本:

chmod +x check_dependencies.sh
./check_dependencies.sh

根据输出提示,安装缺失的组件(若有)。

错误原因:su -c 命令中换行符和引号的组合导致命令被拆分成多行执行,使得 --bind-addr 被误认为独立命令(而非 code-server 的参数)。核心是命令格式的语法问题。

解决方法:用紧凑格式避免换行解析错误

code-server 的启动命令合并为单行(或严格控制换行位置),确保所有参数都属于 code-server 命令。以下是修复后的脚本(直接复制粘贴生成):

cat << 'EOF' > start_multi_user_ide_v2.sh
#!/bin/bash
set -euo pipefail# 配置参数
USERS=(test1 test2 test3 test4 test5 test6 test7 test8 test9 test10)
BASE_PORT=8890
JUPYTER_PORT=8910
JUPYTER_CONFIG_DIR="/opt/conda/etc/jupyter/jupyter_server_config.d"
CHECK_DELAY=2# 步骤1:配置Jupyter代理
echo "🔧 配置Jupyter代理允许的端口(${BASE_PORT}-$((BASE_PORT+9)))..."
mkdir -p "$JUPYTER_CONFIG_DIR"
cat > "$JUPYTER_CONFIG_DIR/proxy-allowed-ports.json" << 'EOF_INNER'
{"ServerProxy": {"allowed_ports": [8890,8891,8892,8893,8894,8895,8896,8897,8898,8899]}
}
EOF_INNER
echo "✅ Jupyter代理配置已更新"# 步骤2:启动各用户Code-Server(修复命令格式)
echo -e "\n🚀 开始启动各用户Code-Server..."
for idx in "${!USERS[@]}"; doUSER="${USERS[$idx]}"PORT=$((BASE_PORT + idx))HOME_DIR="/home/${USER}"DATA_DIR="${HOME_DIR}/.local/share/code-server"EXT_DIR="${HOME_DIR}/.local/share/code-server/extensions"LOG_FILE="${HOME_DIR}/code-server.log"CONFIG_FILE="${HOME_DIR}/.config/code-server/config.yaml"# 检查家目录if [ ! -d "$HOME_DIR" ]; thenecho "❌ 跳过用户${USER}:家目录不存在"continuefi# 备份旧配置if [ -f "$CONFIG_FILE" ]; thenecho "⚠️ 备份用户${USER}旧配置文件..."mv "$CONFIG_FILE" "${CONFIG_FILE}.bak"fi# 创建目录并授权echo "📂 准备用户${USER}目录..."mkdir -p "${DATA_DIR}" "${EXT_DIR}"chown -R "${USER}:${USER}" "${HOME_DIR}/.local" || {echo "❌ 用户${USER}目录授权失败"continue}# 停止旧进程if ss -ltnp | grep -q ":${PORT} "; thenecho "🔌 关闭端口${PORT}旧进程..."pkill -9 -f "code-server.*:${PORT}" || echo "⚠️ 无旧进程"sleep $CHECK_DELAYfi# 核心修复:用单行紧凑格式传递命令,避免换行解析错误echo "▶️ 启动用户${USER}(端口${PORT})..."su - "$USER" -c "nohup code-server --auth none --bind-addr 127.0.0.1:${PORT} --user-data-dir '${DATA_DIR}' --extensions-dir '${EXT_DIR}' --config /dev/null '${HOME_DIR}' > '${LOG_FILE}' 2>&1 & sleep 1" || {echo "❌ 用户${USER}启动命令执行失败,日志:${LOG_FILE}"continue}# 检查启动状态sleep $CHECK_DELAYif ss -ltnp | grep -q "127.0.0.1:${PORT}"; thenecho "✅ 用户${USER}启动成功"elseecho "❌ 用户${USER}启动失败!日志:"tail -n 5 "$LOG_FILE"fi
done# 步骤3:启动JupyterLab
echo -e "\n🌐 启动JupyterLab(端口${JUPYTER_PORT})..."
if ss -ltnp | grep -q ":${JUPYTER_PORT} "; thenecho "🔌 关闭Jupyter旧进程..."pkill -9 -f "jupyter-lab.*:${JUPYTER_PORT}"sleep $CHECK_DELAY
finohup jupyter lab \--ip=0.0.0.0 \--port="${JUPYTER_PORT}" \--allow-root \
> /var/log/jupyterlab.log 2>&1 &sleep $((CHECK_DELAY * 2))
if ss -ltnp | grep -q ":${JUPYTER_PORT} "; thenecho "✅ JupyterLab启动成功"
elseecho "❌ JupyterLab启动失败,日志:"tail -n 5 /var/log/jupyterlab.log
fi# 汇总结果
echo -e "\n📊 启动结果汇总:"
echo "Code-Server监听情况:"
ss -ltnp | grep -E ":889[0-9] " || echo "⚠️ 未发现监听端口"echo -e "\n🌐 访问地址:"
echo "JupyterLab:http://36.151.192.85:23589/lab?token=$(grep -oP 'token=\K[^&]+' /var/log/jupyterlab.log | head -n1)"
echo "test1 Code-Server:http://36.151.192.85:23589/proxy/8890/"
EOF

核心修复说明:

su -c 中的 code-server 命令改为单行紧凑格式,避免因换行导致的参数拆分:
原多行命令容易被shell解析为多个独立命令,而单行格式确保 --auth none--bind-addr 等参数都属于 code-server 命令,解决“--bind-addr: command not found”错误。

使用方法:

  1. 复制上面的命令粘贴到终端,自动生成脚本。
  2. 运行脚本:
    chmod +x start_multi_user_ide_v2.sh
    ./start_multi_user_ide_v2.sh
    

此时 code-server 会正确接收所有参数,免密启动并监听对应端口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92649.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92649.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92649.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DDR中的POD与ODT

一、POD&#xff08;Pseudo Open Drain&#xff09;技术1. 定义与工作原理POD&#xff08;伪开漏&#xff09; 是DDR4/LPDDR4引入的电压标准与驱动架构&#xff0c;替代传统的SSTL&#xff08;Stub Series Terminated Logic&#xff09;。其核心特征是将上拉电源从VDDQ改为VTT&…

企业架构之导论(1)

一、企业架构是什么 企业架构是对企业业务、数据、应用、技术四大核心领域及其相互关系的系统化描述与设计框架。它像一张“城市蓝图”,确保业务战略能精准映射到IT落地: 本质:是连接业务战略(做什么)与技术执行(怎么做)的结构化方法论。 核心组件: 业务架构:定义业…

实战:在已有K8S集群如何新增和删除Node节点

本篇文章将分享一下如何在已有集群添加新节点和删除现有节点1 新增节点到K8S集群新增节点可以分为准备节点、配置节点和将其加入集群三步。1.1 准备新节点准备一个相同操作系统的主机作为新节点。参考以前部署的文章&#xff1a;实战部署k8s 1.28版本集群&#xff0c;跟着操作到…

C++ 黑马 内存分配模型

一, 内存分配模型内存总共有四个分区1 代码区 主要用来存储二进制代码&#xff0c;由操作系统进行管理2 栈区 由编译器自己进行释放和分配&#xff0c;例如函数的传递的参数&#xff0c;局部变量&#xff0c;const修饰的局部常量等等....3 堆区 由程序员自己分配和释放&am…

【华为仓颉编程语言】运行第一个仓颉程序

欢迎来到仓颉编程语言的第一个实战课程。 上节课我们成功安装了仓颉工具链&#xff0c;今天让我们一起编写并运行第一个仓颉程序。相信很多同学都还记得学习第一门编程语言时写的"Hello World"程序&#xff0c;那种看到程序成功运行的激动心情。今天&#xff0c;我们…

利用DeepSeek改写并增强测试Duckdb和sqlite的不同插入方法性能

在前文基础上&#xff0c;好奇作为事务型数据库的SQLite表现怎么样&#xff0c;让DeepSeek来帮忙。 提示词 请仿照附件编写用python插入sqlite数据的测试函数&#xff0c;如果sqlite3没有对应方法就省略 import sqlite3 import pandas as pd import timemethods [字符串拼接, …

进程管理块(PCB):操作系统进程管理的核心数据结构

进程管理块&#xff08;PCB&#xff09;&#xff1a;操作系统进程管理的核心数据结构在现代操作系统中&#xff0c;进程管理块&#xff08;Process Control Block, PCB&#xff09; 是内核用来描述、管理和控制进程生命周期的最核心、最关键的数据结构。它就像是一个进程的“身…

线程的sleep、wait、join、yield如何使用?

sleep:让线程睡眠&#xff0c;期间会出让cpu&#xff0c;在同步代码块中&#xff0c;不会释放锁 wait(必须先获得对应的锁才能调用):让线程进 入等待状态,释放当前线程持有的锁资源线程只有在notify 或者notifyAll方法调用后才会被唤醒,然后去争夺锁. join: 线程之间协同方式,使…

2025年服装智能跟单系统TOP3推荐榜单

TOP1领军者首选推荐&#xff1a;金蝶服装系统【★★★★★】 在服装智能跟单系统的领域&#xff0c;金蝶服装系统凭借其强大的功能和卓越的性能脱颖而出&#xff0c;成为众多企业的首选。尽管本文标题提及的是另一份榜单&#xff0c;但值得一提的是&#xff0c;金蝶系统若参与评…

基于FFmpeg的B站视频下载处理

起因是这样的一天&#xff0c;本人在B站客户端缓存了一个视频&#xff0c;用于学习参考等学术交流&#xff0c;但是视频和音频却是分开且通过Win Hex查看发现文件头含有9个“30”&#xff0c;想到一个个手动删字节不如让程序取代&#xff0c;便有了本文章这一篇文章发布之前&am…

【Vue Router】路由模式、懒加载、守卫、权限、缓存

前言 Vue Router 是 Vue 生态中处理页面跳转的核心工具&#xff0c;它解决了单页应用中 URL 管理、组件切换、状态维护等关键问题&#xff0c;同时提供了丰富的功能&#xff08;如动态路由、嵌套路由、路由守卫&#xff09;。除了经常用到的路由配置以外&#xff0c;我们还需了…

Linux epoll 实现详解 (fs/eventpoll.c)

核心数据结构分析 1. struct eventpoll (epoll 实例核心结构) c struct eventpoll {struct mutex mtx; // 保护 epoll 结构的互斥锁wait_queue_head_t wq; // epoll_wait() 使用的等待队列wait_queue_head_t poll_wait; // 文件 poll() 使用的等待队列struc…

【牛客刷题】小红的项链(字节跳动面试题)

文章目录 一、题目介绍 1.1 输入描述 1.2 输出描述 1.3 示例 二、算法设计思路 三、流程图 四、题解实现 五、复杂度分析 六、关键算法知识点 一、题目介绍 原题链接:https://www.nowcoder.com/practice/3da065cab096478eb603bbfca5af8b02 小红将 n n n个珠子排成一排,然后…

【Html网页模板】HTML炫酷星空(一闪一闪亮晶晶)

文章目录专栏导读功能预览快速开始核心实现拆解1. 背景与基础布局2. 背景层静态星空&#xff08;轻微闪烁&#xff09;3. 前景层“亮晶晶”的闪烁小星星4. 交互与动效5. 行星装饰可配置项与个性化建议初始化顺序&#xff08;入口&#xff09;源码结语专栏导读 &#x1f525;&am…

第一天-CAN Signal信号的Multiplexor多路复用在DBC中实现

&#x1f680; CAN总线的“变形金刚术”&#xff1a;Multiplexor多路复用信号深度揭秘在汽车电子江湖中&#xff0c;当数百个ECU争相发送数据时&#xff0c;如何让一条CAN报文像"变形金刚"一样自由切换形态&#xff1f;Multiplexor&#xff08;多路复用&#xff09;技…

Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02

文章目录【150. Evaluate Reverse Polish Notation】【239. Sliding Window Maximum】【347. Top K Frequent Elements】【150. Evaluate Reverse Polish Notation】 Problem Link Approach: Use a stack. Push numbers onto the stack; when encountering an operator, pop t…

系统架构设计师备考之架构设计高级知识

1.系统架构设计基础知识1.1.软件架构概念软件架构定义软件架构&#xff08;Software Architecture&#xff09;或称软件体系结构&#xff0c;是指系统的一个或者多个结构&#xff0c;这些结构包括软件的构件&#xff08;可能是程序模块、类或者是中间件&#xff09;、构件的外部…

PWM波的频谱分析及matlab 验证[电路原理]

你知道吗&#xff1f;pwm可以制作adc模块哦&#xff01;这样普通的gpio也能实现adc功能了。 我们嵌入式日常接触的pwm波&#xff0c;你真的了解他吗&#xff1f; 只有知道PWM的频谱是怎么样的&#xff0c;才能设计合适的滤波器&#xff0c;下面我们一起从底层数学原理来推导PWM…

相机、镜头参数详解以及相关计算公式

一、工业相机参数 1、分辨率 相机每次采集图像的像素点数&#xff0c;也是指这个相机总共有多少个感光晶片。在采集图像时&#xff0c;相机的分辨率对检测精度有很大的影响&#xff0c;在对同样大的视场成像时&#xff0c;分辨率越高&#xff0c;对细节的展示越明显。 相机像素…

通信中间件 Fast DDS(一) :编译、安装和测试

目录 1.简介 2.Windows编译、安装和测试 2.1.编译环境准备 2.2.编译安装 2.2.1.安装FastCDR 2.2.2.安装Foonathan Memory 2.2.3.安装FastDDS 2.3.验证安装 3.Linux编译、安装和测试 3.1.编译环境准备 3.2.编译安装 3.2.1.安装FastCDR 3.2.2.安装Foonathan M…