首先Linux上需要安装lrzsz工具包,下面是安装命令:
yum install lrzsz
rz和sz便是Linux/Unix同ZModem文件传输的命令行工具,所以要在Xshell连接属性的设置上传协议接受文件路径等,如下图所示:
windows端需要支持ZModem的telnet/ssh客户端(xshell支持),SecureCRT就可以用SecureCRT登录Unix/Linux主机(telnet或ssh均可)。
运行命令rz,即是接收文件(上传到Linux上),xshell就会弹出文件选择对话框,选号文件后关闭对话框,文件就会上传到linux里的当前目录。也可以直接把要上传的文件拖到xshell上完成上传。如下图所示:
运行命令sz file就是发文件到windows上(保存的目录是可以配置)比ftp命令方便多了,而且服务器不用再开FTP服务了。如下图所示:
在Linux中的每个用户必须属于一个组,不能独立于组外。在Linux中每个文件有所有者、所在组、其他组的概念。
ls -ahl #可以看到文件的所有者
chown 用户名 文件名 #修改文件的所有者
ls -ahl #可以看到文件的所有组
chgrp 组名 文件名 #修改文件所在的组
-l 中显示的内容如下:
-rwxrw-r--1 root root 1213 Feb 2 09:39 abc
解释:
chmod 755 abc #赋予abc 权限 rwxr-xr-x
chmod u=rwx,g=rx,o=rx abc #同上,u=用户权限,g=组权限,o=不同组其他用户权限
chmod u-x,g+w abc #给abc去除用户执行的权限,增加组写的权限
chmod a+r abc #给所有用户添加读的权限
改变文件所有者
chown xiaoming abc #改变abc的所有者为xiaoming
chgrp root abc #改变abc所属的组为root
chown root ./abc #改变abc这个目录的所有者是root
chown -R root ./abc #改变abc这个目录及其下面所有文件和目录的所有者是root
改变用户所在的用户组
在添加用户时,可以指定将该用户添加到哪个组中,同样用root的管理权限可以改变某个用户所在的组。
usermod -g 组名 用户名
#或者还可以换成下面这种
usermod -d 目录名 用户名 #改变该用户登录的初始目录
sudo这个目录就是给后面的命令加上root权限(sudo=superuser do),su这个命令是switch user,切换用户,因此sudo su root就是由普通用户切换到root角色。
你要让自己成为有执行sudo权限的人,那就要修改sudoer-list:
sudo visudo
然后再打开的文件里,把你的用户名加上去(按照里面已有用户的格式来填:username ALL=(ALL)ALL,如果你不想输入密码:username ALL=(ALL)NOPASSWD:ALL)
:set number
:set number
#vim /etc/vumrc
可以看到都是一些配置vim环境的数据,我们只需要在行首或者行尾新建一行然后写入:set number ,接下来,输入esc退出,通过:wq保存,即可退出vim。后续的编辑器就会显示行号了。
[ashan@localhost code]$ stat Test02/
File: ‘Test02/’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 805h/2053d Inode: 12345678 Links: 4
Access: (0775/drwxrwxr-x) Uid: ( 1037/ashan) Gid: ( 1038/ashan)
Access: 2019-04-24 16:07:13.890862137 +0800
Modify: 2019-04-24 14:50:21.439702961 +0800
Change: 2019-04-24 14:50:21.439702961 +0800
Birth: -
解释一下:
方法一:
awk '{print NR}' 文件名 | tail -n1 #管道前打印所有行号,管道后则打印最后一行
#或者
awk 'END{print NR}' 文件名
方法二:
grep -n '' 文件名 | awk -F : '{print $1}' | tail -n1
#或者
grep -n '' 文件名 | awk -F : 'END{print $1}'
方法三:
sed -n '$=' 文件名
备注:统计文件的行数,等同于cat 文件名 | wc -l ,具体点就是-n抑制输出,$到最后一行,=打印行号
方法四:
wc -l 文件名
#或者
wc -l 文件名 | awk '{print $1}'
#或者
cat 文件名 | wc -l
命令格式:
cp [-adfilprsu] 源文件 [source] 目标文件(destination)
参数说明:
-a:是指archive的意思,也就是指复制所有的目录
-d:若源文件为连接文件(link file),则复制连接文件属性而非文件本身
-f:强制:若有重复或其他疑问时,不会询问用户,而是强制复制
-i:若目标文件已经存在,在覆盖时会先询问是否真的操作
-l:建立硬连接(hard link)的连接文件,而非复制文件本身
-p:与文件的属性一起复制,而非使用默认属性
-r:递归复制,用于目录的复制操作
-s:复制成符号连接文件(symbolic link),即“快捷方式”文件
-u:若目标文件比源文件旧,更新目标文件
如将/test1目录下的file1复制到/test3目录,并且将文件名改为file2,可输入下列命令:
cp /test1/file1 /test3/file2
命令格式
mv [-fiv] source destination
参数说明:
-f:force,强制直接移动而不询问
-i:若目标文件(destination)已经存在,就会询问是否覆盖
-u:若目标文件已经存在,且源文件比较新,才会更新
如将/test1目录下的file1复制到/test3目录,并将文件名改为file2,可输入一下目录:
mv /test1/file1 /test3/file2
rm [fir] 文件或目录
参数说明:
-f:强制删除
-i:交互模式,在删除前询问用户是否操作
-r:递归删除,常用在目录的删除
如删除/test目录下的file1文件,可以输入以下命令:
rm -i /test/file1
1. 举个例子
#在linux命令行下输入:
df -hl
#显示格式
文件系统 容量 已用 可用 已用% 挂载点
FileSystem Size Used Avail Use% Mounted on
/dev/hda2 45G 19G 24G 44% /
/dev/hda1 494M 19M 450M 4% /boot
/dev/hda6 4.9G 2.2G 2.5G 47% /home
/dev/hda5 9.7G 2.9G 6.4G 31% /opt
none 1009M 0 1009M 0% /dev/shm
/dev/hdb2 75G 75G 0 100% /
以上面的输出为例,表示的意思为:
HD硬盘接口的第二个硬盘(b),第二个分区(2),容量是75G,用了75G,可用0G,因此利用率是100%,被挂载到根分区目录上(/)。
可以通过df --help或du --help查看更多功能,下面是一些常用命令。
2. 常用命令
df -hl #查看磁盘剩余空间
df -h #查看每个根路径的分区大小
du -sh [目录名] #返回该目录的大小
du -sm [文件夹] #返回该文件夹总M数
du -h [目录名] #查看指定文件夹下的所有文件大小(包含子文件夹)
sudo fdisk -l #查看硬盘的分区
sudo hdparm -i /dev/hda #查看IDE硬盘信息
#查看STAT硬盘信息
sudo hdparm -I /dev/sda
sudo apt-get install blktool
sudo blktool /dev/sda id
sync fuser -km /media/usbdisk #u盘无法卸载
3. df和du的区别
df [-ahikHTm] [目录或文件名]
#选项与参数
-a:列出所有的文件系统,包括系统特有的/proc等文件系统
-k:以KBytes的容量显示各文件系统
-m:以MBytes的容量显示个文件系统
-h:以人们较易阅读的GBytes、MBytes、KBytes等格式自行显示
-H:以M=1000K取代M=1024K的进位方式
-T:连同该分区的文件系统名称(例如ext3)也列出
-i:不用硬盘容量,而以inodes的数量来显示
du [-ahskm] 文件或目录名称
选项与参数:
-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已
-h:以人们较易读的容量格式(G/M)显示
-s:列出总量而已,而不列出每个各别的目录占用容量
-S:不包括子目录下的总计,与-s有点差别
-k:以KBytes的容量显示各文件系统
-m:以MBytes的容量显示个文件系统
1. environ介绍
environ是一个字符串所对应环境的映像对象。例如:environ[‘HOME’]就代表了当前这个用户的主目录。
import os
os.environ.keys()#查看系统中的环境变量
2. key字段
因为Linux安装软件的方式比较多,所以没有一个通用的方法能查到这些软件是否安装了,总结起来就是这样几类:
注:其中rpm yum是Redhat系Linux的软件包管理命令,dpkg是debian系列的软件包管理命令。
举个例子,查看tensorflow的版本及其安装路径:
'''进入命令模式'''
python #进入python环境
import tensorflow as tf
tf.__version__ #查看tensorflow的版本
tf.__path__ #查看tensorflow的安装路径
1. novidia-smi: 自带了一个nvidia-smi的命令行工具,会显示显存使用情况:
[ashan@localhost Test02]$ nvidia-smi
Wed Apr 24 17:37:37 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.26 Driver Version: 384.81 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla M4 Off | 0000:05:00.0 Off | 0 |
| N/A 28C P8 7W / 75W | 11MiB / 3785MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
这种只能输出一次结果。
2. 实时观测gpu利用情况
如果需要实时观察GPU的利用情况,就需要一个定时输出功能,这时候就需要用到watch命令,来周期性地执行nvidia-smi命令。
最常用的参数是-n,指定后面是每多少秒执行一次命令。
$ watch [options] command
watch -n 1 nvidia-smi #每隔1s显示GPU所有情况
在一套标准的系统上通常有多个计算设备, TensorFlow 支持 CPU 和 GPU 这两种设备,我们用指定字符串 strings 来标识这些设备。比如:
如果一个 TensorFlow 的 operation 中兼有 CPU 和 GPU 的实现, 当这个算子被指派设备时, GPU 有优先权. 比如matmul中 CPU 和 GPU kernel 函数都存在. 那么在 cpu:0 和 gpu:0 中, matmul operation 会被指派给 gpu:0 .
1. 记录设备指派情况
为了获取你的operations和Tensor被指派到哪个设备上运行,用log_device_placement新建一个session,并设置为True。
#新建一个graph
import tensorflow as tf
a = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],name='a')
b = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],name='b')
c = tf.matmul(a,b)
#新建session with log_device_placement并设置为True
sess = tf.Session(config=tf.ConfigProto(log_device_placement=Ture))
#运行这个op
print(sess.run(c))
可以看到以下输出:
MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
2019-04-26 09:18:19.217753: I tensorflow/core/common_runtime/placer.cc:927] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:GPU:0
a: (Const): /job:localhost/replica:0/task:0/device:GPU:0
2019-04-26 09:18:19.217854: I tensorflow/core/common_runtime/placer.cc:927] a: (Const)/job:localhost/replica:0/task:0/device:GPU:0
b: (Const): /job:localhost/replica:0/task:0/device:GPU:0
2019-04-26 09:18:19.217908: I tensorflow/core/common_runtime/placer.cc:927] b: (Const)/job:localhost/replica:0/task:0/device:GPU:0
[[22. 28.]
[49. 64.]]
2. 设置tensorflow使用的显存大小
默认tensorflow是使用GPU尽可能多的显存,可以通过下面的方式,来设置使用的GPU显存:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)
sess = tf.Session(config=tf.ConfigProto(gpu_options = gpu_options))
上面分配给tensorflow的GPU显存大小为GPU实际显存*0.7
3.手工指派设备
【方法一】 如果你不想使用系统来为operation指派设备,而是手工指派设备,你可以用with tf.device创建一个设备环境,这个环境下的operation都统一运行在环境指定的设备上。
#新建一个graph
import tensorflow as tf
with tf.device('/cpu:0')
a = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],name='a')
b = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],name='b')
c = tf.matmul(a,b)
#新建session with log_device_placement并设置为True
sess = tf.Session(config = tf.ConfigProto(log_device_placement=True))
#运行这个op
print(sess.run(c))
你会发现现在a和b操作都被指派给了cpu:0
【方法二】 在python代码中设置使用的GPU,可以使用下面的代码:
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
4. 在多GPU系统里使用单一GPU
如果你的系统里有多个GPU,那么ID最小的GPU会默认使用。如果你想用其他的GPU,可以用下面的方法显式的声明你的偏好。
#新建一个graph
import tensorflow as tf
with tf.device('/gpu:2'):
a = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],name='a')
b = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],name='b')
c = tf.matmul(a,b)
#新建session with log_device_placement并设置为True
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
#运行这个op
print(sess.run(c))
如果你指定的设备不存在,你会收到InvalidArgumentError错误提示:
为了避免你指定的设备不存在这种情况,你可以在创建的session里把参数allow_soft_placement设置为True,这样tensorflow会自动选择一个存在并且支持的设备来运行operation
#新建一个graph
import tensorflow as tf
with tf.device('/gpu:2'):
a = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3],name='a')
b = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2],name='b')
c = tf.matmul(a,b)
sess = tf.Session(config = tf.ConfigProto(allow_soft_placement=True,log_device_placement = True))
#运行这个op
print(sess.run(c))
5. 使用多个GPU
如果你想要让Tensorflow在多个GPU上运行,你可以建立multi-tower结构,在这个结构里每个tower分别被指配给不同的GPU运行,比如:
#新建一个graph
c = []
for d in ['/gpu:2','/gpu:3']:
with tf.device(d):
a = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[2,3])
b = tf.constant([1.0,2.0,3.0,4.0,5.0,6.0],shape=[3,2])
c.append(tf.matmul(a,b))
with tf.device('/cpu:0'):
sum = tf.add_n(c)
#新建session with log_device_placement并设置为True
sess = tf.Session(config = tf.ConfigProto(log_device_placement = True))
#运行这个op
print(sess.run(sum))
crontab是一个用来设置、删除或显示供守护基础cron执行的定时任务的命令。每一个用户都可以拥有属于自己的定时任务,定时任务文件默认以用户名命名,并放在/var/spool/cron目录,该目录普通用户无访问权限。
1. 命令格式
[abc@localhost etc]$ crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
Usage:
crontab [options] file
crontab [options]
crontab -n [hostname]
Options:
-u 编辑某个用户的cron,只有root可以使用该参数为别的用户设置cron服务,也可用于给用户指定crontab文件
-e 编辑当前用户的crontab,默认使用vi,或者是由visual或editor环境变量指定的编辑器
-l 列出当前用户的crontab
-r 删除当前用户的crontab
-i 与-r一起使用,原来询问用户是否直接删除crontab
2. cron配置文件
写法:
第一个星号表示的是分钟,第二个星号表示小时,第三个星号表示日期,第四个星号表示月份,第五个星号表示星期,command to be executed表示的是需要执行的命令
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
以重启apache为例
注意:周与日月不能同时并存,你可以分别以周或者日月为单位作为循环,但你不可以使用"几月几号且为星期几"的工作模式
方法一:crontab -e
在Linux中,首先进入root权限(sudo su root),然后输入crontab -e,接着就会进入vi编辑界面,再按照上述范例书写即可。
方法二:在/etc/crontab文件中插入
crontab -e是针对用户的cron来设计的,如果是系统的例行任务,该怎么办?是否还是需要以crontab -e来管理例行命令?
答:当然不需要,只需要编辑/etc/crontab这个文件就可以了,需要注意的是:crontab -e的作用其实是/usr/bin/crontab这个执行文件,但是/etc/crontab是个纯文本文件,可以root的身份编辑这个文件。
在某些情况下或者其他的Unix系统中,由于crontab是读到内存中,所以在您修改完/etc/crontab之后可能并不会马上执行,这时候可以重新启动crond服务:/etc/rc.d/init.d/crond restart
Linux系统中,基本上,cron服务的最低检测时间单位是分钟,所以cron会每分钟读取一次/etc/crontab与/var/spool/cron中的数据内容,因此,只要编辑完/etc/crontab文件并且保存后,crontab时设定就会自动执行。
[root@localhost result]$ ls /var/log/cron*
/var/log/cron /var/log/cron-20190610 /var/log/cron-20190616 /var/log/cron-20190623 /var/log/cron-20190701
[root@localhost result]# tail -f /var/log/cron | grep 'eval.py'
Jul 1 14:10:01 211.151.180.233 CROND[36831]: (abc) CMD (/bin/python3 /textcnn/eval.py)
任务可以手动执行,但crontab却不能执行:这种情况一般是由于在crontab文件中没有配置环境变量一起的。
在crontab文件中定义多个调度任务时,需要特别注意一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载如何环境变量的,因此,就需要再crontab文件中指定任务运行所需的所有环境变量,这样,系统执行调度时就没有问题了。
因此,你要保证在shell脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量,注意以下三点:
#python程序时:
source /etc/profile && python3 yourpython.py
#shell脚本时:
直接在sh脚本前面加上:source /etc/profile
如果还是不行,可以尝试重启crontab服务:service crontab restart
1. 格式不同
/etc/crontab文件:
第一个星号表示的是分钟,第二个星号表示小时,第三个星号表示日期,第四个星号表示月份,第五个星号表示星期,user-name即用户名字(如果是在cron -e上修改,则不需要填写这部分内容),command to be executed表示的是需要执行的命令
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
crontab -e 则不需要写user-name
2.使用范围
修改/etc/crontab这种方法只有root用户才能用,这种方法能更加直接方便的给其他用户设置计划任务,crontab -e这种所有用户都可以使用,普通用户也只能为自己设置计划任务,然后自动写入/var/spool/cron/username文件中
3. 服务管理区别
/etc/init.d/crond restart
service crond restart
【参考资料】
3. https://www.cnblogs.com/opsprobe/p/9156973.html
4. https://www.cnblogs.com/Lynn0101/p/10244543.html
5. https://www.cnblogs.com/zhuiluoyu/p/6598928.html
6. https://blog.csdn.net/pacosonswjtu/article/details/80026151
7. https://zhidao.baidu.com/question/150884670.html
8. https://jingyan.baidu.com/article/636f38bb8c1838d6b84610d0.html
9. https://www.cnblogs.com/Baron-Lu/p/6919774.html
10. https://blog.csdn.net/u010272709/article/details/81839218
11. https://blog.csdn.net/u014381600/article/details/72911262
12. https://blog.csdn.net/maoyongfan3/article/details/45060741
13. https://www.cnblogs.com/yuanqiangfei/p/8033000.html
14. https://www.cnblogs.com/123-/p/4189072.html
15. http://www.cnblogs.com/mikasama/p/8032389.html
16. https://www.cnblogs.com/machanghai/p/5976054.html
17. https://www.cnblogs.com/MartinChentf/p/6060252.html
18. https://www.cnblogs.com/bbox/p/9788648.html
19. https://www.cnblogs.com/EasonJim/p/8308717.html
20. https://www.jb51.net/article/137962.htm
21. https://www.cnblogs.com/fazo/p/5531179.html(crontab)
22. https://blog.csdn.net/StephenHendery/article/details/79051140(crontab)