精华内容
下载资源
问答
  • linux work queue工作原理

    2016-03-01 15:20:25
    Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的...
    1. 什么是workqueue
      Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程.

      工作队列(workqueue)是另外一种将工作推后执行的形式.工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。

    2. 数据结构
      我们把推后执行的任务叫做工作(work),描述它的数据结构为work_struct:

    [cpp] view plain copy

    struct work_struct {  
        atomic_long_t data;       /*工作处理函数func的参数*/  
    #define WORK_STRUCT_PENDING 0        /* T if work item pending execution */  
    #define WORK_STRUCT_STATIC 1        /* static initializer (debugobjects) */  
    #define WORK_STRUCT_FLAG_MASK (3UL)  
    #define WORK_STRUCT_WQ_DATA_MASK (~WORK_STRUCT_FLAG_MASK)  
        struct list_head entry;        /*连接工作的指针*/  
        work_func_t func;              /*工作处理函数*/  
    #ifdef CONFIG_LOCKDEP  
        struct lockdep_map lockdep_map;  
    #endif  
    };  
    
    
      这些工作以队列结构组织成工作队列(workqueue),其数据结构为workqueue_struct:
    

    [cpp] view plain copy

    struct workqueue_struct {  
     struct cpu_workqueue_struct *cpu_wq;  
     struct list_head list;  
     const char *name;   /*workqueue name*/  
     int singlethread;   /*是不是单线程 - 单线程我们首选第一个CPU -0表示采用默认的工作者线程event*/  
     int freezeable;  /* Freeze threads during suspend */  
     int rt;  
    };   
    
    
     如果是多线程,Linux根据当前系统CPU的个数创建cpu_workqueue_struct 其结构体就是:
    

    [cpp] view plain copy

    truct cpu_workqueue_struct {  
     spinlock_t lock;/*因为工作者线程需要频繁的处理连接到其上的工作,所以需要枷锁保护*/  
     struct list_head worklist;  
     wait_queue_head_t more_work;  
     struct work_struct *current_work; /*当前的work*/  
     struct workqueue_struct *wq;   /*所属的workqueue*/  
     struct task_struct *thread; /*任务的上下文*/  
    } ____cacheline_aligned;  
    
       在该结构主要维护了一个任务队列,以及内核线程需要睡眠的等待队列,另外还维护了一个任务上下文,即task_struct。
       三者之间的关系如下:
    
    1. 创建工作
      3.1 创建工作queue
      a. create_singlethread_workqueue(name)
      该函数的实现机制如下图所示,函数返回一个类型为struct workqueue_struct的指针变量,该指针变量所指向的内存地址在函数内部调用kzalloc动态生成。所以driver在不再使用该work queue的情况下调用:

      void destroy_workqueue(struct workqueue_struct *wq)来释放此处的内存地址。
      
      
      
      图中的cwq是一per-CPU类型的地址空间。对于create_singlethread_workqueue而言,即使是对于多CPU系统,内核也只负责创建一个worker_thread内核进程。该内核进程被创建之后,会先定义一个图中的wait节点,然后在一循环体中检查cwq中的worklist,如果该队列为空,那么就会把wait节点加入到cwq中的more_work中,然后休眠在该等待队列中。
      
      Driver调用queue_work(struct workqueue_struct *wq, struct work_struct *work)向wq中加入工作节点。work会依次加在cwq->worklist所指向的链表中。queue_work向cwq->worklist中加入一个work节点,同时会调用wake_up来唤醒休眠在cwq->more_work上的worker_thread进程。wake_up会先调用wait节点上的autoremove_wake_function函数,然后将wait节点从cwq->more_work中移走。
      
      worker_thread再次被调度,开始处理cwq->worklist中的所有work节点...当所有work节点处理完毕,worker_thread重新将wait节点加入到cwq->more_work,然后再次休眠在该等待队列中直到Driver调用queue_work...
      

    b. create_workqueue

       相对于create_singlethread_workqueue, create_workqueue同样会分配一个wq的工作队列,但是不同之处在于,对于多CPU系统而言,对每一个CPU,都会为之创建一个per-CPU的cwq结构,对应每一个cwq,都会生成一个新的worker_thread进程。但是当用queue_work向cwq上提交work节点时,是哪个CPU调用该函数,那么便向该CPU对应的cwq上的worklist上增加work节点。
    

    c.小结
    当用户调用workqueue的初始化接口create_workqueue或者create_singlethread_workqueue对workqueue队列进行初始化时,内核就开始为用户分配一个workqueue对象,并且将其链到一个全局的workqueue队列中。然后Linux根据当前CPU的情况,为workqueue对象分配与CPU个数相同的cpu_workqueue_struct对象,每个cpu_workqueue_struct对象都会存在一条任务队列。紧接着,Linux为每个cpu_workqueue_struct对象分配一个内核thread,即内核daemon去处理每个队列中的任务。至此,用户调用初始化接口将workqueue初始化完毕,返回workqueue的指针。

        workqueue初始化完毕之后,将任务运行的上下文环境构建起来了,但是具体还没有可执行的任务,所以,需要定义具体的work_struct对象。然后将work_struct加入到任务队列中,Linux会唤醒daemon去处理任务。
    
       上述描述的workqueue内核实现原理可以描述如下:
    

    3.2 创建工作
    要使用工作队列,首先要做的是创建一些需要推后完成的工作。可以通过DECLARE_WORK在编译时静态地建该结构:
    DECLARE_WORK(name,void (func) (void ), void *data);
    这样就会静态地创建一个名为name,待执行函数为func,参数为data的work_struct结构。
    同样,也可以在运行时通过指针创建一个工作:
    INIT_WORK(structwork_struct work, woid(*func) (void ), void *data);

    1. 调度
      a. schedule_work

      在大多数情况下, 并不需要自己建立工作队列,而是只定义工作, 将工作结构挂接到内核预定义的事件工作队列中调度, 在kernel/workqueue.c中定义了一个静态全局量的工作队列static struct workqueue_struct *keventd_wq;默认的工作者线程叫做events/n,这里n是处理器的编号,每个处理器对应一个线程。比如,单处理器的系统只有events/0这样一个线程。而双处理器的系统就会多一个events/1线程。
      调度工作结构, 将工作结构添加到全局的事件工作队列keventd_wq,调用了queue_work通用模块。对外屏蔽了keventd_wq的接口,用户无需知道此参数,相当于使用了默认参数。keventd_wq由内核自己维护,创建,销毁。这样work马上就会被调度,一旦其所在的处理器上的工作者线程被唤醒,它就会被执行。

    b. schedule_delayed_work(&work,delay);
    有时候并不希望工作马上就被执行,而是希望它经过一段延迟以后再执行。在这种情况下,同时也可以利用timer来进行延时调度,到期后才由默认的定时器回调函数进行工作注册。延迟delay后,被定时器唤醒,将work添加到工作队列wq中。

      工作队列是没有优先级的,基本按照FIFO的方式进行处理。
    
    1. 示例
      [cpp] view plain copy

      include

    展开全文
  • linux/work

    2018-09-22 13:27:00
    切换用户 //默认root用户是无固定密码的,并且是被锁定的,如果想给root设置一个密码 sudo passwd root //输入密码 & 确认密码 //切换root用户 su root //输入密码即可--root //切换为普通用户 su...

    0。切换用户

    //默认root用户是无固定密码的,并且是被锁定的,如果想给root设置一个密码
    sudo passwd root
    //输入密码 & 确认密码
    
    //切换root用户
    su root
    //输入密码即可--root
    
    //切换为普通用户
    su username      //eg:su yufeng
    
    //在root用户模式下,可修改sudoers文件权限
    vi /etc/sudoers
    在该文件User privilege下
    root ALL=(ALL:ALL) ALL 下添加
    shiyufeng ALL=(ALL:ALL) ALL
    
    //当在普通用户模式下。可应用命令切换
    su -
    //查看当前正在登录的用户
    who

    1。查看端口是否被占用

    【1】MAC下查看端口是否被占用

    //方法一
    //查看80口是否被占用
    sudo lsof -i :80
    
    //方法二
    netstat -anp tcp | grep 80
    
    //如下命令可以直接结束占用端口的所有进程:
    lsof -P | grep ':80' | awk '{print $2}' | xargs kill -9

    【2】linux下查看端口是否被占用

    lsof -i:端口号查看某个端口是否被占用
    
    使用netstat -anp|grep 80 

    2。mysql数据库(docker安装mysql)

    //0。搜索mysql镜像
    docker search mysql
    //1。拉取镜像
    docker pull mysql:5.7
    
    //2。查看mysql镜像
    docker images | grep mysql
    
    //3。启动mysql容器
    docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=shiyufeng -d mysql:5.7
    
    //4。进入mysql容器
    docker exec -it mysql bash
    
    //5。连接mysql
    mysql -uroot -pshiyufeng   /  !mysql
    
    //6。退出mysql/容器
    exit

    3。docker 中不能用vim编辑文件解决方案

    //可在docker容器中执行下述命令,即可使用vim编辑文件
    
    //[1]更新来源
    apt-get update
    
    //[2]安装vim
    apt-get install -y vim

    4。操作文件夹/文件

    //1.创建文件夹 (创建learn文件夹,并在下边创建log/etc/html文件夹)
    mkdir learn/log learn/etc learn/html

    //2.以树形显示文件夹目录
    apt-get install tree //安装
    //文件夹下执行命令
    tree

    5。tomcat(docker安装tomcat)

    //查看tomat日志
    docker logs -f tomcat

     

    Linux命令学习笔记--每天进步一点点!!!

    1。【ls命令 --list】

    ls         //当前所在目录下内容
    
    ls -a      //显示所有文件(包括隐藏文件)
    
    ls -l      //l:longlist 长格式显示,显示详细信息
    
    ls -lh     //人性化显示文件大小(组合使用-l和-h)
    
    ls -ld     //查看目录属性(组合使用-l和-d)
    
    ll /dir/   //查看目录dir下的详细内容 ll=ls -l
    
    ls -i /root/file  //查看file文件的i节点

     

    2。mkdir命令 --make directory

    mkdir -p dir1/dir2 //递规创建目录dir1/dir2
    
    mkdir dir  //创建单独目录

     

    3。pwd--print working directory

    pwd    //查看当前所在目录

    4。cd命令 --change directory

    cd dir/      //进入dir目录
    
    cd ~  |  cd  //进入当前用户的家目录
    
    cd -         //进入上次目录
    
    cd ..        //进入上一级目录
    
    cd .         //进入当前目录(无实际作用,即当前目录)
    
    cd ../usr/local/src/     //参照当前目录所在位置查找,相对路径(tab键可补全)
    
    cd /etc/    //从"/"根目录下一级一级查找,绝对路径

     

    5。rm删除命令 --remove

    rmdir dir/   //删除dir目录(注:dir必须为空目录)(少用)
    
    rm file     //删除文件
    
    rm -r dir   //删除一个目录(若其下有目录和文件,会一级级询问是否要删除)
    
    rm -rf dir/   //强制删除目录dir(包括其下的所有目录和文件)(常用)

     

    6。cp复制命令 --copy

    cp filename /tmp/newfilename  //改名复制文件到目录tmp下
    
    cp filename /tmp/        //复制原文件到目录tmp下
    
    cp -a filename /tmp/     //原名复制文件到目录tmp下,且与原属性相同
    
    cp -r dir1/ /tmp/     //拷备目录dir1到目录tmp目录下(-r必须)

    cp filename1 filename2 filename3 ../tmp //将多个文件复制到上一级tmp目录下

     参考博客: linux cp命令的15个示例

    7。mv剪切/改名命令  --move

    mv dir/ /tmp     //剪切目录dir到目录tmp下
    
    mv filename newfilename   //将filename改名为newfilename

     

    8。ln 链接命令 --link

    #硬链接(不推荐):删除原文件不影响链接文件
    ln /root/file.cfg /tmp/newfile.hard  //为file.cfg创建硬链接newfile.hard(文件内容映射,删除哪个文件对别一个不影响)
    ls -i file.cfg  | ls -i newfile.hard  //查看i节点,相同
    
    #软链接(推荐,类比window快捷键):删除原文件,链接文件不可用
    ln -s /root/file /tmp/file.soft  //为root/file创建软件链接file.soft
    #注:软链接源文件必须写绝对路径,否则源文件与链接文件必须在同一目录下才能找到。

     

    9。文件搜索命令(locate / whereis&which/find /grep)

    locate:只能按文件名搜索(速度快,搜索DB)

    whereis / which:用于搜索系统命令

    find:完全匹配

    grep:包含匹配

    【locate命令:搜索文件 --速度快,但只可以按文件名搜索】
    
        locate install.log   //搜索日志文件(对于新创建的文件搜索不到,搜索的是后台数据库(不是实时更新))
    
    【find命令:搜索文件  --速度慢,但可以按条件搜索文件】
        
    
    
    【whereis与which:搜索系统命令】
     
    whereis ls      //查看ls命令所在位置
    
    whereis -b ls   //只需要看ls在哪,不想看帮助文档
    
    where is -m ls  //只看帮助文档
    
    which ls    //查找ls命令所在位置,包括ls的别名(如:ll是ls -l的别名)
    
    ==
    
    whereis   //知道我在哪  
    
    whoami    //知道我是谁 shiyufeng(当前用户)
    
    whatis ls  //知道这个命令是做什么的
    
    
    【find命令】:完全区配
    
    find / -name filename.log   //查找名字是filename.log的文件(耗费环境,搜索了整个根"/")
    
    find /root -name "filename.log*"  //匹配任意内容(*)查找/root目录下
    
    find /root -name "ab[cd]"   //搜索abc或abd的文件
    
    find /root -name "*[cd]"   //搜索以c或d结尾的字符
    
    find /root -iname "abc"  //不区分大小写搜索abc文件
    
    find /root -nouser    //获取指定目录下没有所有者的文件(内核产生的文件/外来文件有可能没有所有者)
    
    #按时间搜索
    #-mtime:修改文件内容。-ctime:改变文件属性。atime:文件访问时间
    find /var/log -mtime +10 //查找10天前修改的文件 +10:10天前 10:10天当天  -10:10天内
    
    #按文件大小搜索
    find /root -size +26k  //查找root目录下大于26k的文件 +10大于10 -10小于10 10等于10
    
    find /etc -size +2M    //查找etc目录下大于2M的文件
    
    find /root -size 25   //查找25个扇区的文件,因此单位不能省
    
    ls -i //获取i节点,根据I节点查找文件名
    find /root inum 节点号   //根据I节点,查找文件名
    
    find /etc -size +20k -a -size -50k   //查找/etc目录下大于20k且小于50k的文件 -a:and
    
    #-exec将前面的结果,以ls -lh显示  {} \固定格式
    find /etc -size +20k -a -size -50k -exec ls -lh {} \  //处理第一个结果以长格式显示
    
    
    【grep命令--搜索字符串】:包含区配
    
    grep "size" file.log    //查找file.log文件中包含size的行
    
    grep -v "size" file.log  //查找不包含size的行

     

    10。帮助命令(man/help/info)

    (1)【man帮助命令--manual】:支持多个帮助级别
    
    man man   //获取指定命令man帮助[man 命令]
    
    man ls    //查看ls的帮助  [:/d  可查看包含/d的,方便查找]
    
    man -f ls  //[man -f ls] <=> whereis 命令 查看命令帮助
    
    man ifconfig //查看ifconfig命令的帮助
    ifconfig  //查看和修改IP命令
    
    apropos passwd   //查看与passwd相关的所有帮助信息
    man -k passwd    //[man -k 命令]查看与passwd相关的所有帮助信息
    
    (2)【其他帮助命令】
    
    【help获取内部命令帮助】
    
    ls --help    //查看ls的帮助命令[命令 --help]
    whereis ls    //确定是否是内部命令,只要找不到都是内部命令
    
    【详细命令帮助info】--不常用
    info man   //显示man的所有详细帮助[info 命令]

     

    11。压缩命令与解压缩命令(.zip .gz .bz2)

    .zip:可以压缩文件/目录 (压缩源文件,并保留源文件)--windows可以解压缩

    .gz:可以压缩文件,且源文件消失;压缩目录,会将目录下的所有子目录/文件分别压缩--windows可以解压缩

    .bz2:bzip2命令不能压缩目录,只能够压缩文件

    1)【.zip压缩格式】=windows(通用)
    
    #压缩文件-压缩文件不一定比源文件小
    zip filename.zip filename  //[zip 压缩文件名 源文件] 注:.zip可省,但建议保留
    
    #压缩目录
    zip -r dirname.zip  dirname //[zip -r 压缩目录名 源目录]
    
    #.zip格式解压缩
    unzip filename.zip  //解压缩文件[unzip 压缩文件]
    unzip dirname.zip   //解压缩目录[unzip 压缩文件]
    2)【.gz压缩格式】-linux专有压缩格式,windows可以解压缩
    
    gzip filename    //将文件压缩成.gz格式且源文件消失
    
    gzip -c filename > filename.gz //将文件压缩成.gz格式且源文件不消失
    
    gzip -r dirname  //压缩目录下的所有子文件,但不会打包成一个文件
    
    【.gz格式解压缩】
    
    gzip -d filename.gz   //[gzip -d 压缩文件]解压缩
    
    gunzip filename.gz    //解压缩
    
    gunzip -r dir      //解压缩目录
    
    【.bz2格式压缩】--注意:bzip2命令不能压缩目录
    
    bzip2 filename  //[bzip2 源文件](不保留源文件)
    
    bzip2 -k filename //保留源文件压缩
    
    [.bz2格式解压缩]
    
    bzip2 -d filename.bz2   //[bzip2 -d 压缩文件]
    
    bunzip2 filename.bz2   //[bunzip2 压缩文件]

     

    12。压缩命令与解压缩命令(.tar.gz / .tar.bz2)

    .tar.gz & .tar.bz2主要用于解决.gz和.bz2压缩目录问题.(实现原理:先打包再压缩)

    ###解决.gz和.bz2格式打包目录的问题(原理:先将文件打包,再压缩)
    
    (1).[.tar格式打包] 
    
    tar -cvf filename.tar filename  //打包文件[tar -cvf 打包文件名 源文件]
    #-c:打包/-v:显示过程/-f:指定打包后的文件名    >可再用gzip压缩
    
    (2).[解打包命令]
    
    tar -xvf filename.tar  //tar -xvf 打包文件名 -x:解打包
    
    (3).打包&压缩(先打包.tar格式再压缩.gz格式)
    
    #打包压缩.tar.gz格式
    tar -zcvf filename.tar.gz filename   //先打包再压缩(c:压缩)[tar -zcvf 压缩包名.tar.gz 源文件]
    tar -zxvf filename.tar.gz    //解压缩[tar -zxvf 压缩包名.tar.gz]
    
    #多文件压缩
    tar -zcvf /tmp/unionfile.tar.gz file1 file2 //将文件file1和file2一起压缩到目录tmp下
    tar -zxvf unionfile.tar.gz  //解压缩
    
    #压缩.tar.bz2格式
    tar -jcvf filename.tar.bz2 filename  //解压缩[tar -jcvf 压缩包名.tar.bz2 源文件]
    tar -jxvf filename.tar.bz2           //解压缩[tar -jxvf 压缩包名.tar.bz2]
    tar -jxvf filename.tar.bz2 -C /tmp/  //指定-C选项,解压缩位置
    
    #只看压缩包内容不解压缩
    tar -ztvf filename.tar.gz  //只压缩包内容不解压缩 [t:test]

     

    13。关机和重启命令

    date  //查看系统时间
    
    #shutdown:关机前可以保存数据 
    shutdown -r 05:30  //5:30重启(ctrl+c退出)
    shutdown -r 05:30 &  //后台执行重启
    shutdown -c   //将重启任务终止
    shutdown -r now
    
    logout    //退出

     

    14。挂载命令

    【挂载命令】https://www.imooc.com/video/4443
    
    【挂载和卸载光盘】
    
    #挂载:分配盘符(linux挂载)(其他存储设备U/光盘需要挂载)
    
    mount  //查询系统中已经过载的设备
    
    vi /etc/fstab  //该文件为系统自动挂载文件
    mount -a //依据配置文件/etc/fstab的内容,自动挂载
    
    //mount [-t 文件系统][-o 特殊选项] 设备
    cd ~   //进入home目录 
    
    vi hello.sh   //创建并编辑文件 hello.sh
    ---------------------
    #!/bin/bash       //#代表下述均为Linux脚本(#在第1行不是注释):固定写法
    
    echo "linux" 
    
    -----------------
    ./hello.sh     //执行脚本“ ./”当前目录 
    
    mount -o remount noexec /home/   //挂载时加-noexec则不执行
    ./hello.sh    //会报权限不足
    
    mount -o remount exec /home/   //重新挂载 exec可执行权限
    1)【挂载光盘】
    
    #media:挂光盘  mnt | misc 三个目录均为空目录,用于挂载用
    mkdir /mnt/cdrom    //在目录
    
    mount -t iso9660 /dev/sr0 /mnt/cdrom/   //sr0是cdrom的软链接
    <=>
    mount /dev/sr0 /mnt/cdrom    //dev/sr0挂载到mnt/cdrom目录下
    
    umount /dev/sr0  | umount /mnt/cdrom  //卸载命令
    2)【挂载U盘】
    
    #linux默认是不支持NTFS系统的
    
    fdisk -l       //fdisk:分区命令,查看系统中已识别的硬盘
    
    mount -t vfat 挂载点  //U盘不能直接在linux中挂载
    
    #ntf-3g,默认支持NTFS,有缺点
    
    #实际应用:网络文件传输

     

    15。用户登录&查看命令

    w  //查看当前登录的所有用户(查看系统当中登录的用户)
    
    w username //查看某一登录的用户(w shiyufeng)
    
    who //查看系统当中登录的用户(比w显示内容更简单)
    
    last //判断系统所有用户(包括之前登录时间和重启时间)的所有信息[实际查询/var/log/wtmp文件]
    
    lastlog  //查看所有用户最后一次登录时间

     

    16。自定义shell脚本

    #shell脚本
    
    vi hello.sh
    --------
    #!/bin/bash         //“#”标识下面为linux的标准脚本
    # The first shell脚本  //#:注释
    echo -e "\e[1;34m hello shell \e[0m"
    --------
    :wq  //保存退出
    
    【脚本执行】
    #方法一:bash命令直接调用
    bash hello.sh  //直接执行脚本[bash命令]
    bash ./hello.sh //“./”表当前目录,可省略
    
    #方法二:先赋予执行权限,再调用shell脚本
    chmod 755 hello.sh  //赋于执行权限
    ./hello.sh          //执行脚本(相对路径)
    /root/hello.sh      //执行脚本(绝对路径)
    
    
    //另:echo命令
    echo [选项] [输出内容]
    eg: echo "hello shell"  //直接会输出hello shell
    
    选项:-e //支持反斜线控制的字符转换

     

    17。bash的基本功能-别名与快捷键|历史命令

    #####bash的基本功能#######
    
    【别名与快捷键】
    
    alias  //查看系统中所有命令别名[alias 别名 原命令]
    
    ls --color=never   //取消颜色显示
    
    alias ls='ls --color=never' //设定命令别名-给命令ls --color=never取个别名ls
    
    vi filename  //vi无颜色,vim有颜色(比vi强大)
    alias vi='vim' //给vim起个别名叫vi,因此打vi,实际打vim
    
    #上述别名只能临时生效
    
    【别名永久生效】
    
    #每一个用户都有自己的环境变量
    vi ~/.bashrc  //写入环境变量配置文件(~代表家目录)
    
    source ~/.bashrc //生效(也可重启)
    
    unalias 别名 //删除别名
    
    【历史命令】
    
    #只能保存正常退出的命令
    history //查看所有历史命令[history [选项] [历史命令保存文件]]
    
    #手动保存历史命令
    history -w   //把缓存中的历史命令写入历史命令保存文件
    
    history -c  //清空历史命令(不建议清空)
    
    #修改历史命令条数
    vi /etc/profile  //查看历史命令保存条数:HISTSIZE=1000(可修改)
    
    #历史命令的调用
    history //查看历史,前显示序号
    !序号   //重复执行每“序号”命令
    !!     //重复执行上一条命令
    !字串  //重复执行最后一条以该字串开头的命令
    eg: history 命令
    ls -l  //第一条 
    ls -a  //第二条
    则! ls 执行的是ls -a这条命令

     

    18。bash的基本功能-输出和输入重定向

    输出重定向:应该输出到屏幕,结果输出到文件等。改变输出的方向(常用)

    输入重定向:应该统计人为键盘输入的内容,结果统计某文件等的内容。改变了输入的方向(了解)

    【输出重定向】--常用
    
    #标准输入输出(输入:输入到PC,输出:从PC输出)
    
    #linux中一切皆文件
    /dev/stdin  //键盘(文件描述符0)
    /dev/sdtout //显示器(1:标准正确输出)
    /dev/sdterr //显示器(2:标准错误输出)
    
    #输出重定向:输出到屏幕的内容,输出到文件中,改变了输出方向,叫输出重定向
    
    #标准输出重定向(只能保存命令的正确输出)
    #只要有输出的命令,均可以重定向到文件(eg:ls..)
    ifconfig > test.log  //[命令 > 文件]  //覆盖方式添加
    cat test.log   //上述命令未显示在屏幕上,而是写入到test.log日志中
    
    ifconfig >> test.log //[命令 >> 文件] //追加
    
    #标准错误输出重定向(注意2与>间无空格)
    yufeng 2 > test.log //将yufeng这个错误命令输出到test.log文件[错误命令 2 >文件]
    
    yufeng 2 >> test.log //追加
    
    #***正确输出和错误输出同时保存--常用(记住)
    
    #方法一:覆盖方式(>)和追加命令(>>)
    ifconfig >> test.log 2>&1 //正确输出:[命令 > 文件 2>&1]
    yufeng >> test.log 2>&1   //错误输出
    
    #方法二:[命令 &>文件] / [命令 &>>文件]
    ls &>>test.log //正确输出
    yufeng &>>test.log //错误输出
    
    #若不想显示命令,可将命令输出到/dev/null
    ls &>/dev/null   // /dev/null黑洞,特殊设备,当作垃圾站
    
    #方法三:[命令 >> 文件1 2>>文件2]正确与错误日志分别保存
    cat xxx >> yes.log 2>>erro.log //把正确日志放到yes.log,错误日志放到erro.log
    
    
    【输入重定向】[wc [选项] [文件名]  --了解
    
    wc  //可以写入任意内容(统计人为输入)
    ctrl + d  //统计输入了多少字符
    
    wc -c //统计字节数
    
    #改变统计输入方法,不是键盘而是文件
    wc < test.log //统计文件输入的字符
    
    wc <<  string //任意输入,直到遇到string,统计string之前的所有字符

     

    19。管道符

    #多个命令顺序执行,命令间无逻辑关系
    date ; ls ; cd /etc ; ls ; pwd  //多个命令顺序执行(不管某一命令是否报错,后绪所有命令依旧正确执行)
    
    #逻辑与,多个命令顺序执行,命令间有逻辑关系
    ls && echo yes  //第一条命令必须正确执行,第2条命令才可以执行
    
    # ||逻辑或:命令1不正确执行,才执行命令2
    ls || ls -l  //命令ls不正确执行,才执行命令ls -l
    
    #判断ls是否正确执行
    ls && echo yes || echo no  //ls正确执行,会打印yes,否则打印no
    
    【管道符】
    
    #命令1 | 命令2  命令1的操作结果作为命令的2的操作对象
    
    ls -l  /etc/ > abc //先将ls -s结果输入到某一文件
    more abc //再查看该文件
    
    more test.log //分屏显示(more查看文件)
    
    ls -l /etc | more  //管道符,more查看ls命令的结果
    
    #查看linux的所有网络连接
    netstat -an   //查看linux所有网络连接
    
    #查看连接子多少人
    netstat -an | grep ESTABLISHED //在命令netstat -an中查询ESTABLISHED这个行
    
    #查看连接子多少人(统计行号)
    netstat -an | grep ESTABLISHED | wc -l

    20。通配符

    ls abc*  //查询包含abc的所有文件
    
    ls abc?  //查询abc后包含1个字符的文件
    
    ls abc[0-9] //查询abc后包含任意一个数字的所有文件
    
    ls abc[0-9][0-9]//查询abc后包含两个数字的所有文件
    
    ls abc[^0-9]  //查询abc后不是数字的所有文件
    
    ls abc[^0-9]* //查询abc后除数字外的所有文件
    
    ls abc[^0-9][a-z] //查询abc后是字母的所有文件

    21。正则表达式

    #正则表达式
    
    echo ls //输出ls
    
    #单引号与双引号,$用于调用系统变量
    a=123 //赋予变量值
    echo $a //查看变量值123
    echo '$a' //原样输出
    echo "$a" //输出变量值123
    
    b=ls  //赋予b变量值ls命令
    echo "$b"  //输出ls,不是预期结果
    
    #反引号用于包含系统命令--少用
    c=`ls` //反引号,将ls命令赋值给c
    echo "$c" //会输出ls命令查询的结果
    
    #$()用于包含命令--常用
    d=$(ls) //<=>d=`ls`,将ls命令赋值给d
    
    #转义字符\将特殊符号$失去意义
    echo \$d //输出$d

     

    快捷键

    ctrl + c //强制终止当前命令

    ctrl + l //清屏

    ctrl + u //从光标所在行删除到行首

    ctrl + a //光标移到命令行首

    ctrl + e //光标移到命令行尾

    ctrl + z //把命令放入后台

    ctrl + r //在历史命令中搜索

    tab //命令补全

     

    22。Linux的文件权限与目录配置

    23. linux中如何添加用户并赋予root权限详解 

    su root
    
    vim /etc/passwd
    
    把用户ID修改为 0
    shiyufeng:x:0:1000:shiyufeng,,,:/home/shiyufeng:/bin/bash

     

    《鸟哥的Linux私房菜》

    转载于:https://www.cnblogs.com/kaixinyufeng/p/9689944.html

    展开全文
  • Linux添加用户

    2018-03-03 13:07:35
    Linux添加用户 useradd work //添加用户 passwd work //设置密码 ssh进行登录时,提示System is going down. vi /etc/pam.d/sshd 注释掉 pam_nologin.so 行,即可

    Linux添加用户


    useradd work //添加用户
    passwd work //设置密码

    ssh进行登录时,提示System is going down.

    vi /etc/pam.d/sshd
    注释掉 pam_nologin.so 行,即可

    展开全文
  • Linux : task work 机制

    2015-05-18 02:19:00
    task work机制可以在内核中向指定的进程添加一些任务函数,这些任务函数会在进程返回用户态时执行,使用的是该进程的上下文。包括下面的这些API: task_work_add task_work_cancel task_work_run 进程对象...

    task work机制可以在内核中向指定的进程添加一些任务函数,这些任务函数会在进程返回用户态时执行,使用的是该进程的上下文。包括下面的这些API:

    • task_work_add
    • task_work_cancel
    • task_work_run

    进程对象task_struct中有个字段用来存储这些待进行的任务列表头即task_works,这个结构体包含一个next指针和需要执行的函数指针。

    205 /**
    206  * struct callback_head - callback structure for use with RCU and task_work
    207  * @next: next update requests in a list
    208  * @func: actual update function to call after the grace period.
    209  */
    210 struct callback_head {
    211         struct callback_head *next;
    212         void (*func)(struct callback_head *head);
    213 };
      4 
      5 static struct callback_head work_exited; /* all we need is ->next == NULL */
      6 
      7 /**
      8  * task_work_add - ask the @task to execute @work->func()
      9  * @task: the task which should run the callback
     10  * @work: the callback to run
     11  * @notify: send the notification if true
     12  *
     13  * Queue @work for task_work_run() below and notify the @task if @notify.
     14  * Fails if the @task is exiting/exited and thus it can't process this @work.
     15  * Otherwise @work->func() will be called when the @task returns from kernel
     16  * mode or exits.
     17  *
     18  * This is like the signal handler which runs in kernel mode, but it doesn't
     19  * try to wake up the @task.
     20  *
     21  * RETURNS:
     22  * 0 if succeeds or -ESRCH.
     23  */
     24 int
     25 task_work_add(struct task_struct *task, struct callback_head *work, bool notify)
     26 {
     27         struct callback_head *head;
     28 
     29         do {
     30                 head = ACCESS_ONCE(task->task_works);
     31                 if (unlikely(head == &work_exited))
     32                         return -ESRCH;
     33                 work->next = head;
     34         } while (cmpxchg(&task->task_works, head, work) != head);
     35 
     36         if (notify)
     37                 set_notify_resume(task);
     38         return 0;
     39 }

    主要工作:

    1. 通过CAS以无锁的形式添加了一个链表元素。(新元素排在原有链表头部)

    2. set_notify_resume函数向指定的进程设置了一个_TIF_NOTIFY_RESUME标记。

    task_work_run执行时机

    在返回用户态之前会对当前进程的标记检查,如果相关标记置位则会调用do_notify_resume

    595 int_signal:
    596         testl $_TIF_DO_NOTIFY_MASK,%edx
    597         jz 1f
    598         movq %rsp,%rdi          # &ptregs -> arg1
    599         xorl %esi,%esi          # oldset -> arg2
    600         call do_notify_resume
    601 1:      movl $_TIF_WORK_MASK,%edi
    602 int_restore_rest:
    603         RESTORE_REST
    604         DISABLE_INTERRUPTS(CLBR_NONE)
    605         TRACE_IRQS_OFF
    606         jmp int_with_check
    607         CFI_ENDPROC
    608 END(system_call)

    以上文件为entry_64.S,而标记定义在thread_info.c中

    130 /* work to do on interrupt/exception return */
    131 #define _TIF_WORK_MASK                                                  \
    132         (0x0000FFFF &                                                   \
    133          ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|                       \
    134            _TIF_SINGLESTEP|_TIF_SECCOMP|_TIF_SYSCALL_EMU))
     70 #define TIF_SYSCALL_TRACE       0       /* syscall trace active */
     71 #define TIF_NOTIFY_RESUME       1       /* callback before returning to user */
     72 #define TIF_SIGPENDING          2       /* signal pending */
     73 #define TIF_NEED_RESCHED        3       /* rescheduling necessary */
     74 #define TIF_SINGLESTEP          4       /* reenable singlestep on user return*/
     75 #define TIF_SYSCALL_EMU         6       /* syscall emulation active */
     76 #define TIF_SYSCALL_AUDIT       7       /* syscall auditing active */
     77 #define TIF_SECCOMP             8       /* secure computing */
     78 #define TIF_MCE_NOTIFY          10      /* notify userspace of an MCE */
     79 #define TIF_USER_RETURN_NOTIFY  11      /* notify kernel of userspace return */
     80 #define TIF_UPROBE              12      /* breakpointed or singlestepping */
     81 #define TIF_NOTSC               16      /* TSC is not accessible in userland */
     82 #define TIF_IA32                17      /* IA32 compatibility process */
     83 #define TIF_FORK                18      /* ret_from_fork */
     84 #define TIF_NOHZ                19      /* in adaptive nohz mode */
     85 #define TIF_MEMDIE              20      /* is terminating due to OOM killer */
     86 #define TIF_POLLING_NRFLAG      21      /* idle is polling for TIF_NEED_RESCHED */
     87 #define TIF_IO_BITMAP           22      /* uses I/O bitmap */
     88 #define TIF_FORCED_TF           24      /* true if TF in eflags artificially */
     89 #define TIF_BLOCKSTEP           25      /* set when we want DEBUGCTLMSR_BTF */
     90 #define TIF_LAZY_MMU_UPDATES    27      /* task is updating the mmu lazily */
     91 #define TIF_SYSCALL_TRACEPOINT  28      /* syscall tracepoint instrumentation */
     92 #define TIF_ADDR32              29      /* 32-bit address space on 64 bits */
     93 #define TIF_X32                 30      /* 32-bit native x86-64 binary */
     94 

    即_TIF_WORK_MASK表示除开(_TIF_SYSCALL_TRACE, _TIF_SYSCALL_AUDIT, _TIF_SINGLESTEP, _TIF_SECCOMP, _TIF_SYSCALL_EMU)之外的所有标记。自然包括了_TIF_NOTIFY_RESUME标记。

    do_notify_resume函数

    729 /*
    730  * notification of userspace execution resumption
    731  * - triggered by the TIF_WORK_MASK flags
    732  */
    733 __visible void
    734 do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
    735 {
    736         user_exit();
    737 
    738 #ifdef CONFIG_X86_MCE
    739         /* notify userspace of pending MCEs */
    740         if (thread_info_flags & _TIF_MCE_NOTIFY)
    741                 mce_notify_process();
    742 #endif /* CONFIG_X86_64 && CONFIG_X86_MCE */
    743 
    744         if (thread_info_flags & _TIF_UPROBE)
    745                 uprobe_notify_resume(regs);
    746 
    747         /* deal with pending signal delivery */
    748         if (thread_info_flags & _TIF_SIGPENDING)
    749                 do_signal(regs);
    750 
    751         if (thread_info_flags & _TIF_NOTIFY_RESUME) {
    752                 clear_thread_flag(TIF_NOTIFY_RESUME);
    753                 tracehook_notify_resume(regs);
    754         }
    755         if (thread_info_flags & _TIF_USER_RETURN_NOTIFY)
    756                 fire_user_return_notifiers();
    757 
    758         user_enter();
    759 }

    可以看到在其中调用tracehook_notify_resume函数,也包括其他一些如信号处理相关的函数。

    tracehook_notify_resume

    174 /**
    175  * tracehook_notify_resume - report when about to return to user mode
    176  * @regs:               user-mode registers of @current task
    177  *
    178  * This is called when %TIF_NOTIFY_RESUME has been set.  Now we are
    179  * about to return to user mode, and the user state in @regs can be
    180  * inspected or adjusted.  The caller in arch code has cleared
    181  * %TIF_NOTIFY_RESUME before the call.  If the flag gets set again
    182  * asynchronously, this will be called again before we return to
    183  * user mode.
    184  *
    185  * Called without locks.
    186  */
    187 static inline void tracehook_notify_resume(struct pt_regs *regs)
    188 {
    189         /*
    190          * The caller just cleared TIF_NOTIFY_RESUME. This barrier
    191          * pairs with task_work_add()->set_notify_resume() after
    192          * hlist_add_head(task->task_works);
    193          */
    194         smp_mb__after_atomic();
    195         if (unlikely(current->task_works))
    196                 task_work_run();
    197 }

    在进程对象的task_works不为null的情况下才有任务需要执行。

    task_work_run

     77 /**
     78  * task_work_run - execute the works added by task_work_add()
     79  *
     80  * Flush the pending works. Should be used by the core kernel code.
     81  * Called before the task returns to the user-mode or stops, or when
     82  * it exits. In the latter case task_work_add() can no longer add the
     83  * new work after task_work_run() returns.
     84  */
     85 void task_work_run(void)
     86 {
     87         struct task_struct *task = current;
     88         struct callback_head *work, *head, *next;
     89 
     90         for (;;) {
     91                 /*
     92                  * work->func() can do task_work_add(), do not set
     93                  * work_exited unless the list is empty.
     94                  */
     95                 do {
     96                         work = ACCESS_ONCE(task->task_works);
     97                         head = !work && (task->flags & PF_EXITING) ?
     98                                 &work_exited : NULL;
     99                 } while (cmpxchg(&task->task_works, work, head) != work);
    100 
    101                 if (!work)
    102                         break;
    103                 /*
    104                  * Synchronize with task_work_cancel(). It can't remove
    105                  * the first entry == work, cmpxchg(task_works) should
    106                  * fail, but it can play with *work and other entries.
    107                  */
    108                 raw_spin_unlock_wait(&task->pi_lock);
    109                 smp_mb();
    110 
    111                 /* Reverse the list to run the works in fifo order */
    112                 head = NULL;
    113                 do {
    114                         next = work->next;
    115                         work->next = head;
    116                         head = work;
    117                         work = next;
    118                 } while (work);
    119 
    120                 work = head;
    121                 do {
    122                         next = work->next;
    123                         work->func(work);
    124                         work = next;
    125                         cond_resched();
    126                 } while (work);
    127         }
    128 }

    1. 通过CAS,以无锁的方式取得task_works链表

    2. 因为原链表是按元素添加到链表的时间逆序排列的(见task_work_add),先把链表反转一遍

    3. 反转链表后,遍历链表,执行各个元素的任务函数即work->func(work) 

    转载于:https://www.cnblogs.com/lailailai/p/4510982.html

    展开全文
  • linux查看用户用户组 more /etc/group |grep workmore /etc/passwd |grep work用stat命令stat -c %U filename查看文件所属用户
  • Linux创建用户

    2015-07-27 19:05:27
    [code="java"] #] groupadd work #] useradd work -g work [/code]
  • Unix是一个多任务系统,允许多用户同时运行多个程序。shell的元字符&amp;提供了在后台运行不需要键盘输入的程序的方法。输入命令后,其后紧跟&amp;字符,该命令就会被送往到linux后台执行,而终端又可以继续...
  • 工作队列(work queue)是Linux内核中将操作延期执行的一种机制。因为它们是通过守护进程在用户上下文执行,函数可以睡眠的时间,与内核是无关的。在内核版本2.5开发期间,设计了工作队列,用以替换此前的keventd机制...
  • [work]linux: 环境变量设置.bashrc

    千次阅读 2018-04-03 16:20:41
    假定想添加的环境变量路径为:/opt/my-tools/android-sdk/tools 1 进入用户的根目录cd $HOME 或 cd ~2 然后打开.bashrc若不存在则新建.bashrc文件vi .bashrc 3 在.bashrc页面最后加上想要加的路径export PATH=$...
  • 最近安装linux 7.2,出现了下面这个情况 我能够用普通用户登录但唯独用root用户不行,找了很多同学和学长,查了很多资料,很多人都没遇到这种情况!! 然后我进入普通用户试了下面这个命令,就好了!! sudo ...
  • 一.问题描述 ...??????...二....1、重启系统,在开机过程中,快速按下键盘上的方向键↑和↓。目的是告知引导程序,我们需要在引导页面选择不同的操作,以便让引导程序暂停。...2、使用↑和↓将选择行设置为第一行(背景...
  • linux下非root用户安装软件入门 By tlanyan | 2013年12月3日 5 Comments本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处:...从windows转移到Linux用户最开始有各种不适,因使用习惯...
  • linux 用户和组管理

    2016-07-21 17:09:28
    添加用户 方法一:useradd -m work 方法二:adduser work 会自动创建home目录修改密码 passwd work删除用户 userdel work
  • 更改文件拥有者-R 是递归的...将test 文件 改为 拥有者 root , 用户work。 chown [ -R ] work test 将test 文件 改为 拥有者 root 更改用户组-R 是递归的意思 chgrp nagios test 将test 文件 用户组 改为 na...
  • Linux用户用户组分配权限以及对文件目录的操作 1.pwd:present work directory 显示当前所在工作目录 2.ls 显示当前目录所有文件及文件夹,其颜色各有不同。 白色:表示普通文件 蓝色:表示目录 绿色:表示...
  • 创建用户 # useradd work 设置用户密码 # passwd work 赋予用户权限 方法一: 修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉 ## Allows people in group wheel to run all commands ...
  • 将test 文件 改为 拥有者 root , 用户work。chown [ -R ] work test 将test 文件 改为 拥有者 root 更改用户组 -R 是递归的意思chgrp nagios test 将test 文件 用户组 改为 nagios。更改文件属性 chmod用数字...
  •  工作队列(work queue)是Linux内核中将操作延期执行的一种机制。因为它们是通过守护进程在用户上下文执行,函数可以睡眠的时间,与内核是无关的。在内核版本2.5开发期间,设计了工作队列,用以替换此前的keventd...
  • 手动解除锁定:查看某一用户错误登陆次数:pam_tally --user例如,查看work用户的错误登陆次数:pam_tally --user work清空某一用户错误登陆次数:pam_tally --user --reset例如,清空 work 用户的错误登陆次数,pam...
  • 使用chown命令可以修改文件或目录所属的用户: 命令:chown 用户 目录或文件名 例如:chown testAdmin /home/work (把home目录下的xuadmin目录的拥有者改为testAdmin用户)  chown -R testAdmin /home/work (所有...
  • linux 修改文件用户组和所有者原创 2016年11月06日 20:47:0376761. linux下修改文件用户组chgrp: change group的简写,修改文件所属的用户组。[java] view plain copychgrp users test.log 修改后查看 ls -l...
  • linux修改文件所属用户和组 ... 例如:chown work /home/work (把home目录下的work目录的拥有者改为work用户)  使用chgrp命令可以修改文件或目录所属的组:  命令:chgrp 组 目录或文件名  例如:
  • linux 普通用户无法使用crontab

    千次阅读 2011-12-08 16:23:26
    Condition: If the user has existed, (test:test) usermod -G test,cron test In short, add the user to the group 'cron'. ...If it still doesn't work, try the code below:   chmod u+s /usr/bin/crontab
  • 当tomcat 更改用户启动时,会遇到访问文件没有权限的问题。 可能存在权限问题的文件包括: 1、日志文件../logs/catalina.out; 2、工作目录缓存文件../tomcat/work/Catalina/localhost 日志文件修改权限可用:...
  • linux下非root用户安装软件入门

    千次阅读 2018-04-17 19:00:39
    本文内容遵从CC版权协议, 可以随意...从windows转移到Linux用户最开始有各种不适,因使用习惯水土不服而放弃Linux的不在少数。还没有领略到Linux的美好就退却,对于这类人只能说可惜。还有部分人在个人电脑上用Li...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475
精华内容 190
关键字:

linuxwork用户

linux 订阅