Linux

命令行指令

Linux要查看所有和pdf相关的命令 可以输入pdf 再按Tab键

目录

  • ls -l看当前目录下文件的基本属性
  • ls -a看隐藏文件
  • ls|wc -l查看当前目录下文件+文件夹数
  • ls -l|grep ^d|wc -l显示当前目录文件夹数
  • ls -l|grep ^-|wc -l显示当前目录文件数
  • ls|gawk -F. '{print $2}'|sort -u得到后缀类型(空白是目录)

压缩

  • bz2文件解压缩:压缩:bzip2 file 解压:bzip2 -dk file.bz2。-d表示解压,-k表示不删除源文件
  • rar文件解压缩:压缩目录:rar a test ./script/,查看压缩包文件内容是:rar l test.rar,解压:unrar e test.rar ./script/
  • tar文件:压缩目录:tar -cvf test.tar ./test,解压:tar -xvf test.tar
  • zip:压缩目录:zip -r test.zip ./test,解压:unzip test.zip
  • 查看zip文件:unzip -l files.zip | less或者vim files.zip
  • fuse-zip 可以实现zip文件的挂载,niubility!

文件操作

  • 服务器文件拷贝到本地:scp xzhou@172.16.46.88:/home/xzhou/Downloads/test.rar ./Downloads/test.rar
  • 本地文件拷贝到docker容器:docker cp ./testwine.zip 容器ID:/home/xzhou/Downloads
  • 查找文件:find * test.rar
  • 删除文件夹 rm -rf test
  • tree可以看到目录树结构
  • sshfs xzhou@172.16.46.88:/home/xzhou/project 88_mount/将远程服务器88的文件夹/home/xzhou/project挂载到本机的88_mount/目录下,管理员需要sshfs xzhou@172.16.46.88:/home/xzhou/project 88_mount/ -o allow_other,取消挂载fusermount -u 88_mount/
  • fusermount是一个很有用的指令,如果挂载不成功就用这个指令取消挂载。但是偶尔会无法取消,显示device is busy,原因就是有进程占着这个文件夹。那么需要先ps aux|grep xzhou找到自己的进程看看什么与此相关,然后kill -s 9 PROCESS_ID,然后再取消挂载。
  • 当然也可以挂载其他服务器的anaconda(这时候注意源文件夹和目标文件夹的名字一致,考虑到不想修改环境变量),但是注意首先需要将本地的~/.bashrc文件注释掉conda部分再source指令,然后再挂载(不然会出现无响应),再取消注释再source指令
  • ln -s /tmp/test1.txt test2.txt 将在当前目录下创建符号文件“test2.txt”,ln -s /tmp/test1.txt 将在当前目录下创建符号文件“test1.txt”。删除链接符号文件语法是rm file或者rm dir
  • 文件夹简单合并命令:将1和2文件夹内容合并到3mkdir 3;mv -i 1 3;mv -i 2 3,这时候1和2文件夹就是空的了。但是当文件夹文件庞大时会报错-bash: /bin/mv: Argument list too long,需要使用指令find 1 -name '*.*' -exec mv {} 3 \;find 2 -name '*.*' -exec mv {} 3 \;
  • 将7行的文本分成前后两部分:cat test.lst|head -n 3(前3) cat test.lst|tail -n +4(后4)

其他

  • cat std_std_wiki.txt|grep --color=always -n 'query'|less -R 显示查询的结构。-R是Repaint screen, discarding buffered input.

Mac对应Windows的按键

Command (or Cmd) ⌘
Shift ⇧
Option (or Alt) ⌥
Control (or Ctrl) ⌃
Caps Lock ⇪

文字处理

  • Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出

PDF相关

PDF->TXT

pdftotext可以得到pdf对应的纯文本版本

字体嵌入

会议提交论文要求PDF字体嵌入
强制字体嵌入:

1
2
pdf2ps template.pdf
ps2pdf -dPDFSETTINGS=/prepress template.ps template.pdf

验证:pdffonts template.pdf
可以看到所有字体已被嵌入

显示PDF信息 (MacOS)

1
2
brew install xpdf
pdfinfo test.pdf

PDF修改作者等metadata (MacOS)

1
2
brew install exiftool
exiftool -Title="Change This Title" -Subject="Fun and PDF" change_my_meta.pdf

图像处理

Mac需要 brew install imagemagick才能使用convert

gif转一些列图片(帧为单位) convert test.gif test%05d.png
一系列png转视频 ffmpeg -i test%05d.png test.mp4

如果需要将视频速度变慢要加选项 -filter:v "setpts=2.0*PTS"
要让符合MP4V2格式需要加选项 -brand mp42
比如ffmpeg -i test%05d.png -filter:v "setpts=2.0*PTS" -brand mp42 test.mp4

系统

指令

  • getconf LONG_BIT得到Linux系统是x86还是x32
  • cat /proc/driver/nvidia/version查看CUDA驱动版本
  • who -b 查看最后一次系统启动的时间 who -r 查看当前系统运行时间
  • 查看所用的桌面环境 env|grep DESKTOP=
  • lsb_release -a查看系统版本(没有就用yum install lsb或者cat /etc/os-release)
  • 关机 shutdown -r now

安装软件的依赖库

Ubuntu:

1
2
3
sudo sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list
sudo apt-get update
sudo apt-get build-dep wine-stable

CentOS:
1
yum-builddep -y wine

增加用户

先登录root用户

  1. adduser xzhou
  2. passwd xzhou 似乎不需要 因为第一步输入了密码

增加网络资源共享文件夹

  1. sudo nano /etc/samba/smb.conf
  2. sudo smbpasswd -a xzhou
  3. sudo service smbd restart

显卡 GPU计算

  • watch -n 1 nvidia-smi 每秒刷新一次 nvidia-smi

进程

  • ps ax | grep python 可以看到其他人在运行的Python代码
  • 已知PID查看指令所在目录:lsof -p PID|grep cwd
  • kill -s 9 PID 强制杀死进程标识号PID的进程
  • 已知PID如何查看完整指令:ps PID
  • 已知端口查进程是 lsof –i:端口号

工具

  • 实时查看网速 sudo apt-get install nethogs & sudo nethogs
  • 查看公网IP curl api.ipify.org 查看私有IP ifconfig

远程控制

安装VNC-server

ps -ef|grep -i vnc 查看正在运行的vncserver的进程
vncserver -kill :1 #关闭这个连接
vncserver :1 重启vncserver

安装teamviewer或xrdp

美化和汉化man

汉化

  1. sudo apt-get install sudo !!-zh???
  2. 查看man 手册安装到哪里,dpkg -L manpages-zh | less
    查看到安装在/usr/share/man/zh_CN
  3. 设一个中文man别名, 修改 ~/.bashrc 添加一个alias :
    alias cman='man -M /usr/share/man/zh_CN',或者用命令sed -i '$a alias cman="man -M /usr/share/man/zh_CN"' .bashrc(在最后一行后增加一行,并写入文件)
  4. source ~/.bashrc 重启终端 cman ls就是汉化的man,man ls就是英文的man
    ##美化
  5. sudo apt-get install most
  6. 修改 ~/.bashrc 添加一个环境变量 :export PAGER="/usr/bin/most -s",或者用命令sed -i '$a export PAGER="/usr/bin/most -s"' .bashrc(在最后一行后增加一行,并写入文件)
  7. source ~/.bashrc 重启终端 man ls就是英文的美化版的man

小技巧

让上一个命令以管理员身份执行

apt-get install ranger然后报权限不足再敲入sudo !!运行上一条命令

快捷键

命令行日常系快捷键

Ctrl + U - 剪切光标前的内容
Ctrl + K - 剪切光标至行末的内容
Ctrl + Y - 粘贴
Ctrl + E - 移动光标到行末
Ctrl + A - 移动光标到行首
Ctrl + F - 跳向下一个空格
Ctrl + B - 跳回上一个空格
Alt + Backspace - 删除前一个单词
Ctrl + W - 剪切光标后一个单词
Shift + Insert - 向终端内粘贴文本

暂停并在后台运行命令

Ctrl + Z - 暂停应用程序(比如正在用nano编辑test.txt)
fg - 重新将程序唤到前台
jobs - 查看任务数目
只要按Ctrl + Z,前台的命令就会暂停,画面就切回到命令行了。然后你就能运行你想要运行的命令,等命令运行完后在终端窗口输入fg就可以回到先前暂停的任务

下载

普通下载

使用axel
apt-get install axel
使用简单 axel URL
我常用的指令:多线程(10个)下载并改变进度条样式:axel -n 32 -a URL

下载视频

使用you-get和youtube-dl以及硕鼠
从Youtube视频中下载音频(wav格式)支持b站
youtube-dl –extract-audio –audio-format wav URL

比如我想下载这个情非得已的音频

  1. 使用python3安装you-get
  2. you-get http://www.miaopai.com/show/R~22buLsn55r7IVQKvMjZ4Le2mJ7PS7BqxjbAg__.htm
  3. ffmpeg -i 阿卡贝拉版情非得已.mp4 -f mp3 -vn 阿卡贝拉版情非得已.mp3
    参数解释:
    -i 表示input,即输入文件
    -f 表示format,即输出格式
    -vn表示vedio not,即输出不包含视频
  4. play 阿卡贝拉版情非得已.mp3 (需要安装sox库)

后台下载视频

如果现在很多个b站视频需要下载,是不是就是CTRL + Z and fg 结合 youtube-dl,实践发现不行,挂起时下载会暂停。之前我玩过树莓派,很多Linux知识都是从那里学到的

所以我发现了screen命令. MacOS是自带的,Linux使用sudo apt-get install screen安装

终端输入(Xshell软件里操作一样的):

1
screen youtube-dl --extract-audio --audio-format mp3 https://www.bilibili.com/video/av6846882

它会下载第一个视频,这时候按住Ctrl+A然后Ctrl+D会回到终端,但是视频依然在下载,这时候再次终端输出新的视频PID,就会下载第二个,以此类推…

查看所以任务是screen -ls,所有视频一旦完成下载,screen -ls就会输出No Sockets found in bilibala...。说明一个任务完成它会自动退出那个虚拟终端的

如果我们关闭终端不影响screen,不信你重新打开终端试试screen -ls

恢复一个虚拟终端命令是screen -r ID号
如果终端本身自己不能结束,就screen -r ID号然后exit

虚拟化技术

Docker

指令

  • 搜索镜像docker search 镜像ID
  • 使用后台运行(-d)容器docker run -d 镜像ID
  • 运行基于容器名docker run --name mycontainer 镜像ID
  • 运行时暴露端口-p <host-port>:<container-port>(如果没指定host-port,主机会随机指定一个可使用的port去和container的port做连接,此时可用docker port 容器ID 容器暴露的端口或者docker ps检查)
  • 运行时挂载宿主机目录-v <host-dir>:<container-dir>
  • 运行容器的shell命令docker run -it ubuntu bash
  • 查看当前正在运行的容器 docker ps,显示已经退出的容器 docker ps -a
  • 列出容器详细信息,例如ip地址docker inspect 容器ID
  • 列出容器的标准输出stdout和stderrdocker logs 容器ID
  • 显示所有镜像 docker images
  • 启动/停止某个容器 docker start/stop 容器ID
  • 删除镜像 docker rmi 镜像ID
  • 删除所有TAG为的镜像 docker images|grep none|awk '{print $3}'|xargs docker rmi
  • 删除容器 docker rm 容器ID
  • 删除所有容器 docker rm $(docker ps -aq)
  • 在容器运行命令显示系统信息 docker run ubuntu cat /etc/os-release,没有这个镜像则创建镜像(用完可删除容器)
  • 开启容器交互模式:docker run -it ubuntu exit退出
  • 打开交互式终端 docker start -i 容器ID,每次使用就使用这个命令就行

Dockerfile

一个范例:

1
2
3
4
5
FROM nginx:1.11-alpine
COPY index.html /usr/share/nginx/html
EXPOSE 80
# equal to nginx -g daemon off;
CMD ["nginx", "-g", "daemon off;"]

执行:
docker build -t my-nginx-image:latest .
docker run -d -p 80:80 my-nginx-image:latest
curl -i http://docker(得到完整的http response)

Dockerfile的ONBUILD指令:

  • 旧dockerfile中有ONBUILD前缀的指令在docker build的时候不会执行
  • 新的dockerfile在docker build的时候会完整执行基础镜像的dockerfile指令(包含ONBUILD 的)以及自己的dockerfile包含的指令
  • 有效简短继承旧dockerfile时需要写的指令量
  • 祖父dockerfile中的ONBUILD在孙子dockerfile做docker build时不会执行

使用.dockerignore可避免增加无用的文件或者敏感文件进入build的过程

建立Dockerfile

  • 根据Dockerfile建立文件 docker build -t wineubuntu . --no-cache --rm
  • ⚠️ Dockerfile不同于SingularityFile 它的建立每个RUN是独立的,因此涉及相对目录时要小心
  • –no-cache代表不使用缓存,这样建立出错不能从中间某一步重来; –rm代表删除建立中的临时容器
  • -t <repository:tag>表示生成镜像的repository名称(即image名称),以及通常作为区分不同版本的TAG
  • 提交至仓库 docker push xzhou2333/wineubuntu

镜像打包发布

  • Docker Hub注册账户开启新的仓库并在终端登录此账号docker login
  • docker commit 容器ID xzhou2333/winecentos,这时候就多出一个镜像了
  • docker push xzhou2333/winecentos

Singularity

指令

–H 指定家目录
–containall 指定以isolated的方式运行镜像(也就是说一般默认会挂载宿主机home目录,pwd当前工作目录以及/tmp目录,但是现在都不挂载)
–pwd 指定进入容器后的初始工作目录

镜像打包发布

  • 注册Singularity Hub账户开启新的仓库
  • 关联Github的Singularity仓库,例如
  • 云端构建镜像 限时两小时

wine

Ubuntu

一般情况下简单的可以终端执行的exe执行就是:wine test.exe
首先wine不是windows模拟器也就基本没有性能损失。
我测试了wine的性能,使用的代码来自Perfect_numbers,OSX,Windows,Ubuntu,Ubuntu(Wine),执行时间分别是61.87s、58.89s、50.88s、50.93s。所以还真是很快,基本没有性能损失。
但是有一次我的C++工程是VS2015编译的,其中底层调用了windows.h,想在Linux编译很麻烦,因此尝试wine。另外这个exe是会调用MXNet的C++API(因为包含神经网络的前馈运算),需要以下Dll库

libgcc_s_seh-1.dll libgfortran-3.dll libmxnet.dll libopenblas.dll libquadmath-0.dll

在Linux上直接执行报错,说是某个函数有未实现的函数(wine: Call from 0x7b44cbda to unimplemented function vcomp140.dll._vcomp_for_static_simple_init_i8, aborting)
我是用VS2015编译的嘛所以wine的可能在vc运行时的版本低了,需要更新。它会下载原生vcomp140.dll然后更新覆盖原本的dll
终端执行winetricks -q vcrun2015
如果是用ssh连上的没有图形界面的话,可能需要使用xvfb-run winetricks -q vcrun2015,让Linux模拟一个桌面(需要安装xvfb软件)
总结一下:

  1. 安装wine 见安装 WineHQ 安装包
  2. sudo apt-get install cabextract(第五步需要)
  3. 退出sudo权限
  4. 安装Winetricks
  5. 为了运行由VS2015编译出来的程序安装vc2015运行时 xvfb-run ./winetricks -q vcrun2015(可选,但是不安装有些软件可能无法运行,xvfb-run也是可选项)
  6. 将dll与exe放在同一个目录下即可。wine test.exe

CentOS

总结一下:

  1. 安装wine 见安装 WineHQ 安装包 CentOS/RHEL,然后yum install xorg-x11-server-Xvfb wget
  2. 退出sudo权限
  3. 安装Winetricks,这时候一般64位的终端exe即可运行了(wine test.exe不行再敲一编就行了…)
  4. 为了运行由VS2015编译出来的程序安装vc2015运行时 ./winetricks -q vcrun2015(可选,但是不安装有些软件可能无法运行,xvfb-run也是可选项)
  5. 第四步报错:(fixme:service:scmdatabase_autostart_services Auto-start service L”MountMgr” failed to start: 2,fixme:service:scmdatabase_autostart_services Auto-start service L”WineBus” failed to start: 2)参考百度知道,即
    find / -name mountmgr.sys cp /usr/lib64/wine/fakedlls/mountmgr.sys /home/xzhou/.wine/drive_c/windows/system32/drivers/ find / -name winebus.sys cp /usr/lib64/wine/fakedlls/winebus.sys /home/xzhou/.wine/drive_c/windows/system32/drivers/
  6. 解决第五步之后第四步继续报错Bad EXE Format.因为CentOS 7没有32位版本,EPEL的wine 没有32位wine,只有64位wine。而vc_redist.x86.exe是一个32位程序。参考CentOS 7 使用 Yum 安装使用最新稳定版 Wine 3继续安装32位的wine
  7. 安装完成后第四步的Bad EXE Format消除,错误变成0009:fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.Windows.Common-Controls" (6.0.0.0)
  8. 然后实在找不到解决办法了。接第四步暴力解决,直接将上一个ubuntu方法的dll拷贝(下载链接见谷歌网盘)过来。cp /home/xzhou/Downloads/vcomp140.dll /home/xzhou/.wine/drive_c/windows/system32。完美解决

所以只需至少要执行1、2、3、4、8即可解决。
不过最好第五步也执行以下这样运行exe时少两个fixme警告

内网穿透

目前使用的是ngrok,如果从内网服务器下载软件会先python -m SimpleHTTPServerngrok http 8000