• [训练管理] 自制镜像训练失败 shell文件语法报错
    如图其它:暂无
  • [技术干货] 每日分享: HBase shell-status命令
    原文地址 https://bbs.huaweicloud.com/blogs/175386 HBase shell中有一个status命令,可以查看HBase集群的一些基本状态,例如:hbase(main):003:0> status3 servers, 0 dead, 2.3333 average load直接运行status命令,可以查看RegionServer的数量和基本的负载情况。 但是这样的结果是否太简单了呢?其实这个命令还可以输入参数,以便查看更多详细的信息的。查看status命令的帮助信息:(只能用help命令查看)hbase(main):001:0> help 'status'Show cluster status. Can be 'summary', 'simple', 'detailed', or 'replication'. Thedefault is 'summary'. Examples:   hbase> status  hbase> status 'simple'  hbase> status 'summary'  hbase> status 'detailed'  hbase> status 'replication'  hbase> status 'replication', 'source'  hbase> status 'replication', 'sink' 例如可以查看replication的基本信息,这些信息在判断replication运行的状态很有帮助,但是这些信息在其它地方比较难获取到(目前版本JMX中没有),只能通过这个命令进行获取。hbase(main):005:0> status 'replication'version 1.0.03 live servers    XXX-172-0-171:       SOURCE: PeerID=1, AgeOfLastShippedOp=0, SizeOfLogQueue=0, TimeStampsOfLastShippedOp=Wed Apr 06 11:00:19 CST 2016, Replication Lag=0       SINK  : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri Apr 01 12:17:12 CST 2016    XXX-172-0-173:       SOURCE: PeerID=1, AgeOfLastShippedOp=0, SizeOfLogQueue=0, TimeStampsOfLastShippedOp=Wed Apr 06 11:00:17 CST 2016, Replication Lag=0       SINK  : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Fri Apr 01 12:17:17 CST 2016    XXX-172-0-172:       SOURCE: PeerID=1, AgeOfLastShippedOp=0, SizeOfLogQueue=0, TimeStampsOfLastShippedOp=Wed Apr 06 11:00:18 CST 2016, Replication Lag=0       SINK  : AgeOfLastAppliedOp=0, TimeStampsOfLastAppliedOp=Mon Apr 04 03:53:53 CST 2016 另外在不方便查看HMaster页面的时候,也可以通过这个命令查看很多集群运行时的信息,很方便使用。 
  • [技术干货] 【Hive】Shell客户端登录beeline提示“authentication failed”
    开启安全认证的MRS集群中,执行beeline命令,登录失败,界面提示“authentication failed”关键字,具体信息如下:Debug is true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false  Acquire TGT from Cache  Credentials are no longer valid  Principal is null  null credentials from Ticket Cache  [Krb5LoginModule] authentication failed  No password provided处理步骤:cd /opt/clientsource bigdata_env命令,配置环境变量。在客户端中执行如下命令,执行登录操作。kinit user然后重新执行beeline命令登录Hive客户端即可。
  • [热门活动] 安装mind_studio 出现这样的错误Failed to prepare rebootshell. Exit 1
    安装mind_studio 出现这样的错误 Failed to prepare rebootshell. Exit 1,请问怎么解决
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第118期Shc-3.6安装配置指南
    1、简介Shc用来对shell脚本进行加密,它将shell脚本转换为一个可执行的二进制文件,从而避免shell脚本中的用户名、密码等重要信息暴露。类别:加密工具2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.5Kernel4.14软件包gcc 4.8.5Shc3.6http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz3、依赖安装yum install gcc make  -y4、编译安装    获取软件包cd /usr/local/srcwget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz   解压软件包tar xf shc-3.6.tgz编译和安装shcmkdir /usr/local/man/man1/ -pcd /usr/local/src/shc-3.6make    回显如上图所示,按回车键结束make install   5、系统配置无6、测试touch hello.shchmod +x hello.shvi hello.sh    输入以下信息并保存#!/bin/bash echo "test shc"   执行./hello.sh回显如下图    执行shc -v -f hello.sh对hello.sh脚本进行加密,回显如下(“-v”表示显示加密过程。“-f”指定需要加密的脚本。)                   执行./hello.sh.x,回显如下       查看hello.sh.x架构    7、参考信息无8、FAQ无
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第088期Shc-3.6安装配置指南
    1、简介Shc用来对shell脚本进行加密,它将shell脚本转换为一个可执行的二进制文件,从而避免shell脚本中的用户名、密码等重要信息暴露。类别:加密工具2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.5Kernel4.14软件包shc3.6http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz3、依赖安装yum install gcc make  -y4、组件编译安装  获取软件包cd /usr/local/srcwget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz  解压软件包tar xf shc-3.6.tgz编译和安装shcmkdir /usr/local/man/man1/ -pcd /usr/local/src/shc-3.6make           回显如上图。make install          5、系统配置无6、测试touch hello.shchmod +x hello.shvi hello.sh      输入以下信息并保存#!/bin/bash echo "test shc"  执行./hello.sh回显如下图  执行shc -v -f hello.sh对hello.sh脚本进行加密,回显如下(“-v”表示显示加密过程。“-f”指定需要加密的脚本。)   执行./hello.sh.x,回显如下 查看hello.sh.x架构    7、参考信息无8、FAQ无
  • [技术干货] 使用shell脚本和cmake工具构建工程
    其实不是我自己写的代码,是自己翻阅了官方例子后,发现提供了使用cmake工具编译程序的方法,自己之前也没有学过shell脚本,就边看教程边给相关文件注释了下,方便以后自己使用相关工具构建程序。这里分享给大家,如果其中有错误,希望大家能够批评指正。(主要是实在用不来Makefile工具QAQ)shell脚本教程:https://www.runoob.com/linux/linux-shell.htmlcmake使用教程:https://www.hahack.com/codes/cmake/HelloDavinci项目地址:https://gitee.com/HuaweiAtlas/samples.git路径:samples/Samples/HelloDavincishell脚本解析HelloDavinci根据README给出的方法,编译 Atlas 200 (Model 3010) 程序执行如下指令:# 如果未安装 A200 的交叉编译器,请先安装编译器# apt-get install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu# DDK 指定# export DDK_HOME=/path/to/ddk/of/A200./build.sh A200其中build.sh的内容为:#!/bin/bash#shell脚本命令,返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行程序的相对位置(绝对位置除外)path_cur=$(cd `dirname $0`; pwd)build_type="Release"#调用build_tools.sh中的函数source $path_cur/../Common/scripts/build_tools.sh#检查环境变量DDK_HOME是否存在,不存在则会报错checkEnvs#检查输出参数是否正确(这一函数只接受A200 A300 A500,且个数只能为1)#检查完成,返回变量build_target(根据输入赋值)checkArgs "$@"#"$@"为所有向脚本传递的参数,例如输入指令#./build.sh A200#则这里传入的参数就是"A200"#变量build_target在函数checkArgs中定义if [ $build_target == "A300" ]; then buildA300 $build_target $build_type $path_curelif [ $build_target == "A200" ]; then#调用函数,操作cmake工具编译程序    buildA200 $build_target $build_type $path_curelse buildA500 $build_target $build_type $path_curfi查阅build_tools.sh,内容相对较多。#!/bin/bashfunction checkEnvs(){    if [ -z $DDK_HOME ];then     echo "[ERROR] DDK_HOME does not exist! Please set environment variable: export DDK_HOME=<root folder of ddk>"     echo "eg:  export DDK_HOME=/home/<ddk install user>/tools/che/ddk/ddk/"     exit 0    fi}function checkArgs(){#$# 传递到脚本的参数个数#-eq 检测两个数是否相等,相等返回 true   if [ $# -eq 0 ]; then       build_target='A300'       return 0   fi#-ne 检测两个数是否不相等,不相等返回 true   if [ $# -ne 1 ]; then       echo "[error] parameter number should be equal to 1 , input parameter should be \"A300\" or \"A500\" to run build.sh."       exit -1   fi   if [ "$1" != "A300" -a "$1" != "A500" -a "$1" != "A200" ]; then       echo "The input parameter should be \"A300\" or \"A500\" or \"A200\" to run build.sh."       exit -1   fi     build_target=$1}function checkArgsA35(){   if [ $# -eq 0 ]; then       build_target='A300'       return 0   fi   if [ $# -ne 1 ]; then       echo "[error] parameter number should be equal to 1 , input parameter should be \"A300\" or \"A500\" to run build.sh."       exit -1   fi   if [ "$1" != "A300" -a "$1" != "A500" ]; then       echo "The input parameter should be \"A300\" or \"A500\"  to run build.sh."       exit -1   fi   build_target=$1}function preparePath() {    rm -rf $1#-p 确保目录名称存在,不存在的就建一个#例如:mkdir -p BBB/Test#在工作目录下的 BBB 目录中,建立一个名为 Test 的子目录。 若 BBB 目录原本不存在,则建立一个。(注:本例若不加 -p,且原本 BBB目录不存在,则产生错误。)    mkdir -p  $1    cd  $1}function buildA300() {    path_build=$3/out    path_cmake=$3/build    preparePath $path_build    cmake -DBUILD_TARGET=$1 \       -DCMAKE_BUILD_TYPE=$2 $path_cmake    make -j8}function buildA500() {    path_build=$3/out    path_cmake=$3/build    path_toolchain=$3/../CMake/Euler.cmake    preparePath $path_build    cmake -DBUILD_TARGET=$1 \       -DCMAKE_BUILD_TYPE=$2 \    -DCMAKE_TOOLCHAIN_FILE=$path_toolchain $path_cmake    make -j8}#$1=$build_target $2=$build_type $3=$path_curfunction buildA200() {    path_build=$3/out    path_cmake=$3/build    path_toolchain=$3/../CMake/Atlas200SOC.cmake    preparePath $path_build    #核心操作,给cmake工具各项赋值    cmake -DBUILD_TARGET=$1 \       -DCMAKE_BUILD_TYPE=$2 \    -DCMAKE_TOOLCHAIN_FILE=$path_toolchain $path_cmake    make -j8}cmake工具调用相关Atlas200SOC.cmake指定编译用的编译器,以及cmake搜索范围。set(CMAKE_SYSTEM_NAME Linux)set(CMAKE_SYSTEM_PROCESSOR aarch64)set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)set(CMAKE-AR /usr/bin/aarch64-linux-gnu-ar)set(CMAKE_RANLIB /usr/bin/aarch64-linux-gnu-ranlib)#以CMAKE_FIND_ROOT_PATH_MODE_PACKAGE为例说明,另外几项类似#此变量控制是否 CMAKE_FIND_ROOT_PATH 和 CMAKE_SYSROOT 由...使用 find_package()#如果设置为ONLY,则仅根目录为CMAKE_FIND_ROOT_PATH 将被搜索。如果设置为NEVER,则根目录为 CMAKE_FIND_ROOT_PATH将被忽略,仅使用主机系统根目录。如果设置为BOTH,则主机系统路径和中的路径CMAKE_FIND_ROOT_PATH 将被搜索。set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)build/CMakeList.txt主执行文件,主要是设置好编译选项,宏变量和引用,在子目录中添加具体的编译文件。#程序编译所需的cmake最低版本cmake_minimum_required(VERSION 2.8)#-fstack-protector-all 检测栈溢出#gcc编译器 -Wl选项告诉编译器将后面的参数传递给链接器#relro 是一种用于加强对 binary 数据段的保护的技术。relro 分为 partial relro 和 full relro#使用Full RELRO编译时需要加上选项 gcc -Wl,-z,relro,-z,now#-z,noexecstack 开启NX程序保护选项#NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令add_compile_options(-std=c++11 -fstack-protector-all -Wl,-z,relro,-z,now,-z,noexecstack)project(HelloDavinci)#设置宏变量供cmake系统使用set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})set(PROJECT_SRC_ROOT ${CMAKE_CURRENT_LIST_DIR}/..)set(CMAKE_MODULE_PATH ${PROJECT_SRC_ROOT}/../CMake/)# ddkfind_package(DDK REQUIRED)include_directories(${DDK_INCLUDE_DIRS} ${DDK_CEREAL_INCLUDE_DIRS} ${DDK_PROTOBUF_INCLUDE_DIRS})# commoninclude_directories(${PROJECT_SRC_ROOT}/include)include_directories(${PROJECT_SRC_ROOT}/../Common/)#添加子目录add_subdirectory(host)add_subdirectory(device)build/host/CMakeList.txtproject(host)if(${BUILD_TARGET} MATCHES "A200")    add_definitions(-DATLAS_DEVICE)else()    add_definitions(-DATLAS_HOST)endif()# copy graph.config filefile(COPY ${PROJECT_SRC_ROOT}/graph.config        DESTINATION ${CMAKE_BINARY_DIR})include_directories(${PROJECT_SRC_ROOT}/../Common/GraphManager)#使用 aux_source_directory 命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名aux_source_directory(${PROJECT_SRC_ROOT}/../Common/GraphManager GraphManager_SRC)include_directories(${PROJECT_SRC_ROOT}/../Common/FileManager)aux_source_directory(${PROJECT_SRC_ROOT}/../Common/FileManager FileManager_SRC)aux_source_directory(${PROJECT_SRC_ROOT}/SrcEngine SrcEngine_SRC)aux_source_directory(${PROJECT_SRC_ROOT}/DstEngine DstEngine_SRC)aux_source_directory(${PROJECT_SRC_ROOT} main_SRC)#可执行程序编译add_executable(main ${main_SRC} ${GraphManager_SRC} ${FileManager_SRC} ${SrcEngine_SRC} ${DstEngine_SRC})target_include_directories(main PUBLIC ${DDK_PROTOBUF_INCLUDE_DIRS})target_link_libraries(main ${DDK_HOST_LIBRARIES} ${DDK_PROTOBUF_LIBRARYS})build/device/CMakeList.txtproject(device)if(NOT ${BUILD_TARGET} MATCHES "A200")    include(${PROJECT_SRC_ROOT}/../CMake/Ascend.cmake)endif()# build for device# HelloDavinciaux_source_directory(${PROJECT_SRC_ROOT}/HelloDavinci HelloDavinci_SRC)#将HelloDavinci_SRC目录中的源文件编译为静态链接库libDevice.soadd_library(Device SHARED ${HelloDavinci_SRC})target_include_directories(Device PUBLIC ${PROJECT_SRC_ROOT}/HelloDavinci)target_link_libraries(Device ${DDK_DEVICE_LIBRARIES})
  • [技术干货] Shell脚本应用——while循环语句
    while循环语句for循环语句非常适用于列表对象无规律,且列表来源已固定的场合,而对于要求控制循环次数,操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用——while循环语句。1.while语句的结构使用while循环语句是,可以根据特定的条件反复执行一个命令序列,知道该条件不再满足为止。在脚本应用中,应该尽量避免出现死循环的情况,否则后边的命令操作将无法执行。因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。1)while循环语句的语法结构while 条件测试操作do命令序列done2)while循环语句流程图使用while循环语句时,有两个特殊的条件测试操作。即true(真)和false(假)。使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或使用exit语句退出脚本);反之若使用false作为条件,则循环体将不会执行。3)while循环语句的使用场景1.循环次数已知;2.必须有一个可以控制循环变量的语句。2.while语句应用示例要求:批量创建有规律编号的用户实施步骤:[root@localhost ~]# vim useraddwhile.sh #!/bin/bash PREFIX="stu" i=1 while [ $i -le 10 ] do useradd ${PREFIX}$i echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null let i++ done [root@localhost ~]# sh useraddwhile.sh [root@localhost ~]# tail /etc/passwd stu1:x:1005:1005::/home/stu1:/bin/bash stu2:x:1006:1006::/home/stu2:/bin/bash stu3:x:1007:1007::/home/stu3:/bin/bash stu4:x:1008:1008::/home/stu4:/bin/bash stu5:x:1009:1009::/home/stu5:/bin/bash stu6:x:1010:1010::/home/stu6:/bin/bash stu7:x:1011:1011::/home/stu7:/bin/bash stu8:x:1012:1012::/home/stu8:/bin/bash stu9:x:1013:1013::/home/stu9:/bin/bash stu10:x:1014:1014::/home/stu10:/bin/bash循环体内部,通过语句“let i++”(等同于i=expr $i + 1)来是变量i的值增加1,一直循环,直到满足条件为止。
  • [技术干货] Shell脚本应用——case分支语句
    1.case语句的结构1)case语句的语法结构case 变量值 in模式1)命令序列1;;模式2)命令序列2;;……* )默认命令序列esac2)case语句流程图使用case分支语句是,几个值得注意的特点:Shell脚本应用(三)3)case语句的使用场景某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列,这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。2.case语句应用实例[root@localhost ~]# vim hitkey.sh #!/bin/bash read -p "请输入一个字符,并按Enter键确认:" KEY case "$KEY" in [a-z]|[A-Z]) echo "你输入的是字母 $KEY" ;; [0-9]) echo "你输入的是数字 $KEY" ;; *) echo "你输入的是非法字符 $KEY" esac [root@localhost ~]# sh hitkey.sh 请输入一个字符,并按Enter键确认:1 你输入的是数字 1 [root@localhost ~]# sh hitkey.sh 请输入一个字符,并按Enter键确认:w 你输入的是字母 w [root@localhost ~]# sh hitkey.sh 请输入一个字符,并按Enter键确认:@ 你输入的是非法字符 @
  • [技术干货] Shell脚本应用——for循环语句
    for循环语句在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。当面对各种列表重复工作任务时,使用if语句已经不能满足需要了,就需要使用到for语句。1.for语句结构使用for循环语句时,需要指定一个变量及可能的取值列表,针对不同的取值重复执行相同的命令序列,知道变量值用完退出循环。1)for循环语句的语法结构:for 变量名 in 取值列表do命令序列done语句结构中,for语句的操作对象为用户吧指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间用空格进行分隔。位于do……done之间的命令序列称为循环体,其中的执行语句需要应用变量以完成相应的任务。2)for循环语句流程图3)for循环语句的使用场景1. 循环次数未知;2.完整遍历整个取值列表。2.for语句应用示例要求:1.根据姓名列表批量创建用户;2.用户的初始密码是“123456”实施步骤:[root@localhost ~]# vim /root/users.txt //新建一个取值列表 xiaozhang xiaoli xiaowang xiaosun [root@localhost ~]# vim useraddfor.sh //创建批量创建用户的脚本 #!/bin/bash ULIST=$(cat /root/users.txt) for UNAME in $ULIST do useradd $UNAME echo "123456" | passwd --stdin $UNAME &> /dev/null done [root@localhost ~]# sh useraddfor.sh //执行脚本 [root@localhost ~]# tail -4 /etc/passwd //验证效果 xiaozhang:x:1001:1001::/home/xiaozhang:/bin/bash xiaoli:x:1002:1002::/home/xiaoli:/bin/bash xiaowang:x:1003:1003::/home/xiaowang:/bin/bash xiaosun:x:1004:1004::/home/xiaosun:/bin/bash注意:if语句、for语句及其他各种shell脚本语句都是可以嵌套使用的。
  • [问题求助] 实时分数,shell脚本,c++linux版本的demo
      如题,请问这三个可以提供吗?  什么时间可以提供?
  • [技术分享] shell图形界面--dialog
    本帖最后由 烟花易冷 于 2018-5-28 22:20 编辑我们经常在Linux/Unix终端环境下安装软件时可以看到信息对话框弹出,需要用户输入yes/no/密码等相关信息,从而引导用户以一种直观的方式输入必要的信息,得到较好的人机交互。今天就简单介绍一下实现该方法的其中一个工具--gdialog liunx 下的dialog 工具是一个可以和shell脚本配合使用的文本界面下的创建对话框的工具。每个对话框提供的输出有两种形式: 1. 将所有输出到stderr ,而不显示到屏幕。 2. 使用退出状态码,“OK”为0,“NO”为1,"ESC"为255 gdialog命令可以为menu、input、message、text、info、checklist、radiolist等创建对话框,其语法如下: [code]dialog [--create-rc ] [--title ] [--backtitle ] [box options][/code]其中: --create-rc :将对话框的基本配置信息输出到制定文件 --title : 对话框标题 --backtitle : 背景标题 box options: 对话框说明信息,主要有如下几个: 1)--yesno :指定yes/no选项,text为文本内容,height大小为0-40,width为0-80 2)--msgbox :创建ok选项 3)--infobox :具有message对话框特征 4)--inputbox :输入的文本将从标准错误设备输出 5)--textbox :将文本内容显示在对话框中 6)--menu [ ]: 创建菜单,menu-height菜单高度,tag菜单名称,item菜单项说明 7)--checklist [ ]:多选框 8)--gauge :进度条 案例: $ dialog --msgbox "hello world" 20 40 创建长为20,宽为40,内容为“hello world”的ok选项框 15987 $ dialog --gauge "test" 10 50 80 创建进度条 15988 本文重在引导大家了解该命令的常规使用,具体介绍大家可以man一下,会得到更详细的信息
  • Mongodb查询中游标的使用及相关知识
    本帖最后由 Nosql_newbee 于 2018-4-6 17:03 编辑 游标的使用: MongoDB中,db.collection.find()方法返回一个游标,你可以通过迭代游标来访问文档的内容,在mongo shell中如果没将返回的cursor赋予局部变量(用var定义的变量),游标会自动迭代数据,默认为20行,这就是直接在shell中执行db.user.find()的结果。将返回结果赋予局部变量就可以手动的迭代访问cursor中的数据了。 首先在数据库中**测试数据 for(i=0;i100;i++){db.user.insert({"x":i});} var myCursor = db.user.find(); 可以通过next()方法来访问游标中数据 while(myCursor.hasNext()){ print(tojson(myCursor.next())); } hasNext()检查是否有后续结果存在。 还可以通过forEach()来迭代cursor访问文档, myCursor.forEach(printJson); https://docs.mongodb.com/manual/reference/method/#js-query-cursor-methods 可以在这个网址查看更多的cursor方法。 调用find时,shell并不立即查询数据库,而是等待真正开始要求获得结果时才发送查询,这样在执行之前可以给查询附加额外的选项,几乎游标对象的每个方法都 返回游标本身,这样就可以按任意顺序组成方法链。例如下面几种方法的表达式等价的: var myCursor = db.user.find().sort({"x":1}).limit(1).skip(10); var myCursor = db.user.find().limit(1).sort({"x":1}).skip(10); var myCursor = db.user.find().skip(10).limit(1).sort({"x":1}); 此时,查询还没有真正的执行,所有这些函数都只是构造查询,现在进行如下操作, myCursor.hasNext() 这时,查询被发往服务器。shell立刻获得前100个或前4M的数据(两者之间较小的),这样下次调用next()就不必再次链接服务器获取结果了,客户端使用完第一组数据时,shell会再一次联系数据库,使用getMore请求提取更多的结果。getMore请求包含一个查询标示符,项数据查询是否还有更多的结果,这个过程会一直持续到游标耗尽或者结果全部返回。 limit,skip和sort 要限制结果数量,可在find后使用limit函数,例如,只返回3个结果,可以这样限制 db.user.find().limit(3) 要是匹配的结果不到3个,则返回匹配数量的结果。limit指定的上限,skip与limit类似 db.find().skip(3) 该操作会忽略前三个匹配的文档,然后返回剩余的文档,如果集合中能匹配的文档少于3个,则不会返回任何文档。 sort接受一个对象作为参数,这个对象是一组键/值对,键对应文档的键名,值代表排序的方向。排序的方向1(升序),-1(降序),如果指定了多个键,则按照这些键被指定的顺序逐个排序,例如,按照"username"升序,按照"age"降序,可以这样写 db.user.find().sort({"username":1,"age":-1}) 这三个方法组合使用,对于分页非常有用,例如在线商店,要显示商品,每页50个,按照价格降序排列,可以这样写: db.user.find({"name":"mp3"}).limit(50).sort({"price":1}) 当用户点击下一页时, db.user.find({"name":"mp3"}).limit(50).sort({"price":1}).skip(50) 然而,skip过多的结果会导致性能问题。
  • [交流分享] xshell替代品,好用的SSH工具
    因为种种原因,公司不让用Xshell了,痛苦之余找到了一个好用的工具 FinalShell: http://www.hostbuf.com/t/988.html
  • 你懂 Linux 吗?关于 Linux 你可能不是非常了解的七件事
    本帖最后由 燕姑娘 于 2017-10-9 17:46 编辑使用 Linux 最酷的事情之一就是随着时间的推移,你可以不断获得新的知识。每天,你都可能会遇到一个新的实用工具,或者只是一个不太熟悉的奇技淫巧,但是却非常有用。这些零碎的东西并不总是能够改变生活,但是却是专业知识的基础。 即使是专家,也不可能事事皆知。无论你有多少经验,可能总会有更多的东西需要你去学习。所以,在这儿我列出了七件关于 Linux 你可能不知道的事情。 一个查找命令历史的交互模式 你可能对 history 命令非常熟悉,它会读取 bash 历史,然后以编号列表的方式输出到标准输出(stdout)。然而,如果你在 curl 命令的海洋里寻找一个特定的链接(URL),那么这个列表并不总是那么容易阅读的。 你还可以有另一个选择,Linux 有一个交互式的反向搜索可以帮助你解决这个问题。你可以通过快捷键 ctrl+r启动交互模式,然后进入一个交互提示中,它将会根据你提供的字符串来向后搜索 bash 历史,你可以通过再次按下 ctrl+r 向后搜索更老的命令,或者按下 ctrl+s 向前搜索。 注意,ctrl+s 有时会与 XON/XOFF 流控制冲突,即 XON/XOFF 流控制也会使用该快捷键。你可以通过运行 stty -ixon 命令来禁用该快捷键。在你的个人电脑上,这通常是有用的,但是在禁用前,确保你不需要 XON/XOFF 。 Cron 不是安排任务的唯一方式 Cron 任务对于任何水平的系统管理员,无论是毫无经验的初学者,还是经验丰富的专家来说,都是非常有用的。但是,如果你需要安排一个一次性的任务,那么 at 命令为你提供了一个快捷的方式来创建任务,从而你不需要接触 crontab 。 at 命令的运行方式是在后面紧跟着你想要运行任务的运行时间。时间是灵活的,因为它支持许多时间格式。包括下面这些例子: 2567 当你以带参数的方式输入 at 命令以后,将会提示你该命令将在你的 Linux 系统上运行。这可能是一个备份脚本,一套维护任务,或者甚至是一个普通的 bash 命令。如果要结束任务,可以按 ctrl+d 。 另外,你可以使用 atq 命令查看当前用户的所有任务,或者使用 sudo atq 查看所有用户的任务。它将会展示出所有排定好的任务,并且每个任务都伴有一个 ID 。如果你想取消一个排定好的任务,可以使用 atrm 命令,并且以任务 ID 作为参数。 你可以按照功能搜索命令,而不仅仅是通过名字 记住命令的名字非常困难,特别是对于初学者来说。幸运的是,Linux 附带了一个通过名字和描述来搜索 man 页面的工具。 下次,如果你没有记住你想要使用的工具的名称,你可以尝试使用 apropos 命令加上你想要干的事情的描述。比如,apropos build filesystem 将会返回一系列名字和描述包括了 “build” 和 “filesystem” 单词的工具。 apropos 命令接受一个或多个字符串作为参数,但同时它也有其他参数,比如你可以使用 -r 参数,从而通过正则表达式来搜索。 一个允许你来管理系统版本的替代系统 如果你曾进行过软件开发,你就会明白跨项目管理不同版本的语言的支持的重要性。许多 Linux 发行版都有工具可以来处理不同的内建版本。 可执行文件比如 java 往往符号链接到目录 /etc/alternatives 下。反过来,该目录会将符号链接存储为二进制文件并提供一个管理这些链接的接口。Java 可能是替代系统最常管理的语言,但是,经过一些配置,它也可以作为其他应用程序替代品,比如 NVM 和 RVM (NVM 和 RVM 分别是 NodeJS 和 Ruby 的版本管理器)。 在基于 Debian 的系统中,你可以使用 update-alternatives 命令创建和管理这些链接。在 CentOS 中,这个工具就叫做 alternatives 。通过更改你的 alternatives 文件中的链接,你便可以安装一个语言的多个版本,并且在不同的情况下使用不同的二进制。这个替代系统也提供了对任何你可能在命令行运行的程序的支持。 shred 命令是更加安全的删除文件方式 我们大多数时候总是使用 rm 命令来删除文件。但是文件去哪儿了呢?真相是 rm 命令所做的事情并不是像你所想像的那样,它仅仅删除了文件系统和硬盘上的数据的硬链接。硬盘上的数据依旧存在,直到被另一个应用重写覆盖。对于非常敏感的数据来说,这会带来一个很大的安全隐患。 shred 命令是 rm 命令的升级版。当你使用 shred 命令删除一个文件之后,文件中的数据会被多次随机覆写。甚至有一个选项可以在随机覆写之后对所有的数据进行清零。 如果你想安全的删除一个文件并且以零覆盖,那么可以使用下面的命令: 2592 同时,你也可以使用 -n 选项和一个数字作为参数,从而指定在随机覆盖数据的时候迭代多少次。 通过自动更正来避免输入很长的无效文件路径 有多少次,你输入一个文件的绝对路径,然而却看到“没有该文件或目录”的消息。任何人都会明白输入一个很长的字符串的痛苦。幸运的是,有一个很简单的解决办法。 内建的 shopt 命令允许你设置不同的选项来改变 shell 的行为。设置 cdspell 选项是避免输入文件路径时一个字母出错的头痛的一个简单方式。你可以通过运行 shopt -s cdspell 命令来启用该选项。启用该选项后,当你想要切换目录时,会自动更正为最匹配的目录。 Shell 选项是节省时间的一个好方法(更不用说减少麻烦),此外还有许许多多的其他选项。如果想查看你的系统中所有选项的完整列表,可以运行不带参数的 shopt 命令。需要注意的是,这是 bash 的特性,如果你运行 zsh 或者其他可供选择的 shell,可能无法使用。 通过子 shell 返回到当前目录 如果你曾经配置过一个比较复杂的系统,那么你可能会发现你需要频繁的更换目录,从而很难跟踪你所在的位置。如果在运行完一个命令后自动返回到当前位置,不是很好吗? Linux 系统实际上提供了一个解决该问题的方法,并且非常简单。如果你想通过 cd 命令进入另一个目录完成一些任务,然后再返回当前工作目录,那么你可以将命令置于括号中。你可以在你的 Linux 系统上尝试下面这个命令。记住你当前的工作目录,然后运行: 2571 该命令会输出 /etc 目录的内容。现在,检查你的当前工作目录。它和执行该命令前的目录一样,而不是 /etc 目录。 它是如何工作的呢?运行一个括号中的命令会创建一个子 shell 或一个当前 shell 进程的复刻副本。该子 shell 可以访问所有的父变量,反之则不行。所以请记住,你是在运行一个非常复杂的单行命令。 在并行处理中经常使用子 shell ,但是在命令行中,它也能为你带来同样的力量,从而使你在浏览文件系统时更加容易。 作者简介: Phil Zona 是 Linux Academy 的技术作家。他编写了 AWS、Microsoft Azure 和 Linux 系统管理的指南和教程。他同时也管理着 Cloud Assessments 博客,该博客旨在帮助个人通过技术实现他们的事业目标。 来自:[color=rgb(61,177,88)]Linux中国 作者:[color=rgb(61,177,88)]PHIL ZONA
总条数:136 到第
上滑加载中