linux基础知识之常用命令[深度学习版]

linux基础知识之常用命令

    • XSHELL工具上传文件到Linux以及下载文件到本地(Windows)
      • 安装Xftp
      • 使用rz和sz命令
    • Linux的权限
      • (一)组
      • (二)文件权限
        • 查看文件权限(ls)
        • 改变权限(chmod)
        • 改变所有者(chown)和用户组(chgrp)
      • (三)普通用户用sudo su给自己加root权限
    • Linux的文件
      • (一) 编辑器中的行号
      • (二)文件的行数统计
      • (二)文件内容搜索
      • (三)查看 文件/文件夹 的修改时间
      • 统计文本行数
    • Linux的文件夹
      • 复制文件夹(cp)
      • 移动文件夹(mv)
      • 删除文件夹(rm)
    • Linux的磁盘空间(df、du)
      • (一)查看磁盘空间使用情况
    • Linux的环境变量 — OS.ENVIRON介绍
    • Linux的软件安装
      • 查看是否安装软件
    • python中的库
      • (一)查看python中库的版本及其安装路径
    • GPU
      • (一)查看GPU的使用情况
      • (二)tensorflow中指定CPU/GPU
        • 使用GPUs
    • Linux中的定期执行
      • crontab
        • crontab 命令介绍
        • crontab -e范例
        • 在Linux上部署轮询脚本
        • 查看crontab运行情况
        • crontab无法执行的原因
        • /etc/crontab文件和crontab -e命令区别

XSHELL工具上传文件到Linux以及下载文件到本地(Windows)

安装Xftp

安装后,在Xshell的工具栏上点击:
在这里插入图片描述

使用rz和sz命令

首先Linux上需要安装lrzsz工具包,下面是安装命令:

yum install lrzsz

rz和sz便是Linux/Unix同ZModem文件传输的命令行工具,所以要在Xshell连接属性的设置上传协议接受文件路径等,如下图所示:
linux基础知识之常用命令[深度学习版]_第1张图片
windows端需要支持ZModem的telnet/ssh客户端(xshell支持),SecureCRT就可以用SecureCRT登录Unix/Linux主机(telnet或ssh均可)。
运行命令rz,即是接收文件(上传到Linux上),xshell就会弹出文件选择对话框,选号文件后关闭对话框,文件就会上传到linux里的当前目录。也可以直接把要上传的文件拖到xshell上完成上传。如下图所示:
linux基础知识之常用命令[深度学习版]_第2张图片
运行命令sz file就是发文件到windows上(保存的目录是可以配置)比ftp命令方便多了,而且服务器不用再开FTP服务了。如下图所示:
linux基础知识之常用命令[深度学习版]_第3张图片

Linux的权限

(一)组

在Linux中的每个用户必须属于一个组,不能独立于组外。在Linux中每个文件有所有者、所在组、其他组的概念。

  • 所有者
    一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者。
ls -ahl #可以看到文件的所有者
chown 用户名 文件名 #修改文件的所有者
  • 所在组
    当某个用户创建了一个文件后,这个文件所在的组就是该用户所在的组。
ls -ahl #可以看到文件的所有组
chgrp 组名 文件名 #修改文件所在的组
  • 其他组
    除开文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组。

(二)文件权限

查看文件权限(ls)

-l 中显示的内容如下:

-rwxrw-r--1 root root 1213 Feb 2 09:39 abc

解释:

  • 10个字符确定不同用户能对文件干什么
  • 第一个字符代表文件(-)、目录(d)、链接(l)
  • 其余字符每3个一组(rwx)、读®、写(w)、执行(x)
    a) 第一组rwx:文件所有者的权限是读、写和执行
    b) 第二组rw-:与文件所有者同一组的用户的权限是读、写但不能执行。
    c) 第三组r–:不与文件所有者同组的其他用户的权限是读不能写和执行。
  • 也可以用数字表示为:r = 4,w = 2,x = 1,因此rwx = 4+2+1 = 7
  • -1表示连接的文件数
  • root 表示用户
  • root 表示用户所在的组
  • 1213表示文件大小
  • Feb 2 09:39 表示最后修改日期
  • abc 表示文件名

改变权限(chmod)

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 #给所有用户添加读的权限
  • 符号类型改变文件权限linux基础知识之常用命令[深度学习版]_第4张图片

改变所有者(chown)和用户组(chgrp)

改变文件所有者

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 su给自己加root权限

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

Linux的文件

(一) 编辑器中的行号

  1. 设置行号:在vi或者vim编辑器的命令模式下,输入set number,按下回车就显示行号了
:set number
  1. 关闭行号:在vi或者vim编辑器的命令模式下,输入set nonumber,按下回车就关闭行号了。
:set number
  1. 永久性的显示行号:在/etc/vimrc(/etc/virc)文件中修改一下:
#vim /etc/vumrc

可以看到都是一些配置vim环境的数据,我们只需要在行首或者行尾新建一行然后写入:set number ,接下来,输入esc退出,通过:wq保存,即可退出vim。后续的编辑器就会显示行号了。

(二)文件的行数统计

(二)文件内容搜索

  1. 在没有打开文件之前,可以用"cat <文件名> | grep <关键字>"
  2. 打开的话,可以输入"/<关键字>"查找

(三)查看 文件/文件夹 的修改时间

  1. 使用stat filename 命令来查看文件
[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: -

解释一下:

  • Access简写为atime,表示文件访问时间,当文件内容被访问时,更新这个时间。
  • Modify简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。
  • Change简写为ctime,表示文件的状态时间,当文件的状态权限被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。
  • File:显示文件名
  • Size:显示文件大小
  • Blocks:文件使用的数据块总数
  • IO Block:IO块大小
  • regular file:文件类型(常规文件)
  • Device:设备编号
  • Inode:Inode号
  • Links:链接数
  • Access:文件的权限
  • Gid、Uid:文件所有权的Gid和Uid

统计文本行数

方法一:

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

Linux的文件夹

复制文件夹(cp)

命令格式:

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)

命令格式

mv [-fiv] source destination

参数说明:
-f:force,强制直接移动而不询问
-i:若目标文件(destination)已经存在,就会询问是否覆盖
-u:若目标文件已经存在,且源文件比较新,才会更新

如将/test1目录下的file1复制到/test3目录,并将文件名改为file2,可输入一下目录:

mv /test1/file1 /test3/file2

删除文件夹(rm)

rm [fir] 文件或目录

参数说明:
-f:强制删除
-i:交互模式,在删除前询问用户是否操作
-r:递归删除,常用在目录的删除

如删除/test目录下的file1文件,可以输入以下命令:
rm -i /test/file1

Linux的磁盘空间(df、du)

(一)查看磁盘空间使用情况

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 --helpdu --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:列出文件系统的整体磁盘使用量,由于df主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要在Superblock内的信息,所以这个命令显示结果的速度非常快速。
df [-ahikHTm] [目录或文件名]
#选项与参数
-a:列出所有的文件系统,包括系统特有的/proc等文件系统
-k:以KBytes的容量显示各文件系统
-m:以MBytes的容量显示个文件系统
-h:以人们较易阅读的GBytes、MBytes、KBytes等格式自行显示
-H:以M=1000K取代M=1024K的进位方式
-T:连同该分区的文件系统名称(例如ext3)也列出
-i:不用硬盘容量,而以inodes的数量来显示
  • du:评估文件系统的磁盘使用量(常用在估计目录所占磁盘容量),du这个命令其实会直接到文件系统内去搜寻所有的文件数据。
du [-ahskm] 文件或目录名称
选项与参数:
-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已
-h:以人们较易读的容量格式(G/M)显示
-s:列出总量而已,而不列出每个各别的目录占用容量
-S:不包括子目录下的总计,与-s有点差别
-k:以KBytes的容量显示各文件系统
-m:以MBytes的容量显示个文件系统

Linux的环境变量 — OS.ENVIRON介绍

1. environ介绍
environ是一个字符串所对应环境的映像对象。例如:environ[‘HOME’]就代表了当前这个用户的主目录。

import os
os.environ.keys()#查看系统中的环境变量

2. key字段

  • windows:
    os.environ[‘HOMEPATH’]:当前用户主目录
    os.environ[‘TEMP’]:临时目录路径
    os.environ[‘PATHEXT’]:可执行文件
    os.environ[‘SYSTEMROOT’]:系统主目录
    os.environ[‘LOGONSERVER’]:机器名
    os.environ[‘PROMPT’]:设置提示符
  • linux:
    os.environ[‘USER’]:当前使用用户
    os.environ[‘LC_COLLATE’]:路径扩展的结果排序时的字母顺序
    os.environ[‘SHELL’]:使用shell类型
    os.environ[‘LAN’]:使用的语言
    os.environ[‘SSH_AUTH_SOCK’]:ssh的执行路径

Linux的软件安装

查看是否安装软件

因为Linux安装软件的方式比较多,所以没有一个通用的方法能查到这些软件是否安装了,总结起来就是这样几类:

  1. rpm包安装的,可以用rpm -qa看到,如果要查找某软件包是否安装,用rpm -qa | grep ‘软件或者包的名字’。
  2. deb包安装的,可以用dpkg -l看到,如果是查找指定软件包,用dpkg -l | grep ‘软件或者包的名字’。
  3. yum方法安装的,可以用yum list installed 查找,如果是查找指定包,命令后加 | grep “软件包或者包名”。
  4. 如果是以源码包自己编译安装的,例如 .tar.gz 或者 tar.bz2形式的,这个只能看可执行文件是否存在了。上面两种方法都看不到这种源码形式安装的包,如果是以root用户安装的,可执行出现通常都在/sbin:/usr/bin目录下。

注:其中rpm yum是Redhat系Linux的软件包管理命令,dpkg是debian系列的软件包管理命令。

python中的库

(一)查看python中库的版本及其安装路径

举个例子,查看tensorflow的版本及其安装路径:

'''进入命令模式'''
python #进入python环境
import tensorflow as tf
tf.__version__ #查看tensorflow的版本
tf.__path__ #查看tensorflow的安装路径

GPU

(一)查看GPU的使用情况

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

在一套标准的系统上通常有多个计算设备, TensorFlow 支持 CPU 和 GPU 这两种设备,我们用指定字符串 strings 来标识这些设备。比如:

  • “/cpu:0”: 机器中的 CPU
  • “/gpu:0”: 机器中的 GPU, 如果你有一个的话.
  • “/gpu:1”: 机器中的第二个 GPU, 以此类推…

如果一个 TensorFlow 的 operation 中兼有 CPU 和 GPU 的实现, 当这个算子被指派设备时, GPU 有优先权. 比如matmul中 CPU 和 GPU kernel 函数都存在. 那么在 cpu:0 和 gpu:0 中, matmul operation 会被指派给 gpu:0 .

使用GPUs

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))

Linux中的定期执行

crontab

crontab 命令介绍

crontab是一个用来设置、删除或显示供守护基础cron执行的定时任务的命令。每一个用户都可以拥有属于自己的定时任务,定时任务文件默认以用户名命名,并放在/var/spool/cron目录,该目录普通用户无访问权限。
linux基础知识之常用命令[深度学习版]_第5张图片
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配置文件

  1. /var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的文件就是一般一个用户最多只有一个crontab文件
  2. /etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
  3. /etc/cron.d/这个目录用来存放任何要执行的crontab文件或脚本。

crontab -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
# |  |  |  |  |
# *  *  *  *  * command to be executed

以重启apache为例

  1. 每晚21:30重启
    30 21 * * * /usr/local/etc/rc.d/lighttpd restart
  2. 每月1、10、22日的4:45重启
    45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
  3. 每两个小时
    0 /2 * * * /usr/local/etc/rc.d/lighttpd restart
  4. 晚上11点到早上8点之间每两个小时
    0 23-8/2 * * * /usr/local/etc/rc.d/lighttpd restart
  5. 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
    0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

注意:周与日月不能同时并存,你可以分别以周或者日月为单位作为循环,但你不可以使用"几月几号且为星期几"的工作模式

在Linux上部署轮询脚本

方法一: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时设定就会自动执行。

查看crontab运行情况

  1. 先进入root角色:sudo su root
  2. 如果要查看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
  1. 如果要查看目前正在运行的某个程序:
[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)
  1. 如果crontab没有执行,可以到/var/spool/mail/username文件中查看

crontab无法执行的原因

任务可以手动执行,但crontab却不能执行:这种情况一般是由于在crontab文件中没有配置环境变量一起的。
在crontab文件中定义多个调度任务时,需要特别注意一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载如何环境变量的,因此,就需要再crontab文件中指定任务运行所需的所有环境变量,这样,系统执行调度时就没有问题了。
因此,你要保证在shell脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量,注意以下三点:

  1. 脚本中涉及文件路径时要写全局路径
  2. 脚本执行要用到python、java等其他环境变量时,需要通过source命令引入环境变量,如:
#python程序时:
source /etc/profile && python3 yourpython.py
#shell脚本时:
直接在sh脚本前面加上:source /etc/profile 

如果还是不行,可以尝试重启crontab服务:service crontab restart

/etc/crontab文件和crontab -e命令区别

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
  1. crontab会进行语法检查,vi不会
  2. 有些os的crond不会重读配置,所以用service重启
    crontab -e是某个用户的周期计划任务;/etc/crontab是系统的周期任务

【参考资料】
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)

你可能感兴趣的:(Linux)