当前位置: 首页 > 编程日记 > 正文

Linux使用systemd服务和crontab实现Shell脚本开机自动运行&编辑当前用户或者指定用户的crontab内容crontab -e

简介

systemd是Linux系统中的一个初始化系统和服务管理器。它可以用于在系统启动时自动运行Shell脚本。
crontab是一个用于定时执行任务的工具。我们可以通过编辑crontab文件来设置开机自启动

前提条件

创建一个Shell脚本文件,例如myscript.sh。该脚本将在系统启动时自动运行。
将脚本文件移动到一个合适的目录,例如/path/to/myscript.sh。

使用systemd服务

创建一个.service文件

[Unit]
Description=My Script Service
After=network.target

[Service]
ExecStart=/path/to/myscript.sh

[Install]
WantedBy=default.target

将.service文件移动到/etc/systemd/system/目录下。

service文件内容详解

[Unit]
Description=My Script Service
After=network.target

Description:描述服务的简短说明
After:指定了服务应该在哪个目标(target)之后启动,在这里是"network.target",则服务需要在网络启动之后才能正常运行

[Service]
ExecStart=/path/to/myscript.sh
ExecStart:指定了服务启动时的执行命令或脚本的路径

[Install]
WantedBy=default.target
WantedBy:指定了服务应该被关联到哪个目标(target)进行启动,默认为"default.target",意味着服务会随系统的默认目标一起启动。
1234567891011121314
#刷新systemd服务:
sudo systemctl daemon-reload

#使用以下命令来启用服务并使其在系统启动时自动运行:
sudo systemctl enable myscript.service

#使用以下命令手动启动服务:
sudo systemctl start myscript.service

注意:若你此时手动启动服务,它将会立即运行。但是,系统重启后,服务会自动启动。

使用crontab

打开终端,并输入以下命令来编辑crontab文件:

crontab -e
#在打开的文件中添加以下内容:

@reboot /path/to/myscript.sh
#/path/to/myscript.sh是你的Shell脚本文件的路径

保存并退出编辑器。



linux 定时任务之crontab

crond服务提供两种方式设置定时任务,一种是系统定时任务,一种是普通用户的定时任务。对于系统定时任务,是由系统管理员通过编写/etc/crontab配置文件来设定,crontab任务就存放在/etc/crontab文件里。而普通用户的定时任务可以通过当前用户,crontab -e的方式来编写,编写的定时任务存放在/var/spool/cron/$USER文件里。

crontab依赖于crond服务
service crond status
chkconfig --list|grep crond
软件包由crontabs-1.10-33.el6.noarch提供
rpm -qa|grep crontab

crond服务每隔1分钟会检查/etc/crontab以及/var/spool/cron/$USER文件内容,如果发现新增的,会重新加载变化文件加载至内存(cron日志里会出现:(system) RELOAD (/etc/crontab)),如果在修改配置文件后,想更快的执行,可以重启crond服务,通过检查/var/log/cron日志,发现可以加快几秒钟。

Sep  2 10:54:25 centos6 crond[4050]: (CRON) STARTUP (1.4.4)
Sep  2 10:54:26 centos6 crond[4050]: (CRON) INFO (running with inotify support)
Sep  2 10:54:26 centos6 crond[4050]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Sep  2 10:55:02 centos6 CROND[4060]: (root) CMD (sh /tmp/test.sh)

Sep  2 10:56:01 centos6 crond[4050]: (*system*) RELOAD (/etc/crontab)

管理员编写系统例行性任务
vim /etc/crontab
在这个配置文件里需要指定执行命令的用户,而在crontab -e中是不需要的,因为crontab -e中就是当前登录用户来执行命令。
SHELL、PATH变量定义了在这个配置文件中的命令如果不写绝对路径时候,在哪里搜寻命令。所以一般建议写成绝对路径来执行。
MAILTO 用于将下面的定时任务执行过程中发生的错误和error发送给哪个用户的邮箱,当然也会记录在/var/log/cron日志中。

有两种方式写法:
1、指定定时间隔,写入执行命令,在这里建议指定执行用户
比如每隔1分钟由root打印一下时间发送到/tmp/time.txt文件里

*/1 * * * * root date>>/tmp/time.txt

2、通过run-parts命令运行指定目录下的所有shell脚本,这种只能在/etc/crontab中配置,在crontab -e中无法配置
比如每天3点50分让root用户执行一下test_sh目录下的所有脚本

(1)创建test_sh目录
mkdir -p /tmp/test_sh
(2)将shell脚本存放在test_sh目录里
shell脚本必须具有执行权限
chmod u+x *
(3)编写定时任务
50 03 * * * root run-parts /tmp/test_sh

系统默认的用于存放shell脚本的目录

[root@centos6 ~]# ls -ld /etc/cron*ly
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.daily
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.hourly
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.monthly
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.weekly
[root@centos6 ~]# 
比如每小时执行一次的任务,可以将脚本放在/etc/cron.hourly目录下
编写/etc/crontab,定在每小时15分执行
15 * * * * root run-parts /etc/cron.hourly

crontab的配置文件(格式说明)

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# 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中某些命令涉及使用%,比如date命令,那么需要将%进行转义
,代表多个值,每个值用,分割开
a-b代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”
a/b 代表从a值开始,每隔b值执行一次。比如在分钟列上,2/47,从2分钟开始,每隔47分钟执行一次,也就是2,49,2...执行后续命令

在crontab中书写多条命令

*/2 * * * * date >/tmp/test3.log;/bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log
*/2 * * * * date >/tmp/test3.log && /bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log
*/2 * * * * date >/tmp/test3.log||/bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log

常见的命令执行间隔周期的设置

格式设置中,都是将条件进行求并集的关系

每一分钟执行一次command
* * * * * cmd
每小时的15,30,45,00执行一次命令
00,15,30,45 * * * * cmd
每天10:15,10:30,10:45执行该命令
15,30,45 10 * * * cmd
每天上午8-11点的第3和15分钟执行
3,15 8-11 * * * cmd
每隔2天的上午8-11点的第3和15分钟执行
3,15 8-11 */2 * * cmd
每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 cmd
每月1、10、22日的4 : 45
45 4 1,10,22 * * cmd
每周六、周日的1 : 10
10 1 * * 6,0 cmd
每天18 : 00至23 : 00之间每隔30分钟
0,30 18-23 * * * cmd
晚上11点到早上7点之间,每隔1小时执行一次
* 23-07/1 * * * cmd
每月的4号与每周一到周三的11点【这里是取两个条件的并集,这个很重要】
00 11 4 * 1-3 cmd 

其他注意事项:
尽量不要将任务放在同一时间执行。

在crond中,最小定时单位是分钟,要实现每隔多少秒执行,必须借助脚本来实现

每隔2秒执行一次命令
* * * * *  sh test.sh
#!/bin/bash
step=2 
for (( i = 0; i < 60; i=(i+step) )); do  
   date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ;  
   sleep $step  
done  
exit 0  

每隔50秒执行一次命令
50秒均分多少分钟,而1分钟是60秒,那就是50和60的最小公倍数是300秒也就是5分钟。

*/5 * * * *  sh test.sh
#!/bin/bash
step=50 
for (( i = 0; i < 300; i=(i+step) )); do  
   date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ;  
      sleep $step  
done       
exit 0    


每隔90分钟执行一次
90分钟能均分多少小时,也就是90分钟和60分钟的最小公倍数180,也就是3个小时,那就每隔3个小时执行一次,而3个小时也能均分一天24小时,这3个小时内由90分钟均分。

* */3 * * *  sh test.sh
#!/bin/bash
step=5400 
for (( i = 0; i < 10800; i=(i+step) )); do  
   date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ;  
      sleep $step  
done       
exit 0    

修改当前用户crontab内容
crontab -e 其实修改的当前用户的crontab内容,文件是在/var/spool/cron/$USER里的内容

修改完成后,重启crond服务,在延迟几秒后执行crontab内容,否则linux的cron服务每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d

Aug 29 16:16:48 dg1 crond[24132]: (CRON) STARTUP (1.4.4)
Aug 29 16:16:50 dg1 crond[24132]: (CRON) INFO (running with inotify support)
Aug 29 16:16:50 dg1 crond[24132]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
.
.
.

Aug 29 16:17:01 dg1 CROND[24138]: (root) CMD (su - oracle -c  /home/oracle/test/test.sh 1>1.log 2>&1)
Aug 29 16:17:01 dg1 CROND[24139]: (root) CMD (root (/usr/sbin/ntpdate 1.cn.pool.ntp.org && /sbin/hwclock -w) &>/dev/null)

修改系统的crontab内容,在/etc/crontab中设定

/etc/cron.deny中的用户不允许执行crontab内容

/etc/cron.daily、/etc/cron.hourly、/etc/cron.monthly 这些目录下的脚本就是每天、每小时、每月要执行的脚本,

/etc/cron.d/下的文件是系统配置的定时crontab内容

crontab命令的使用:
1、查看当前用户的crontab任务
crontab -l
crontab -u oracle -l
2、删除当前用户的crontab内容
crontab -ri
crontab -u oracle -ri
3、编辑当前用户或者指定用户的crontab内容
crontab -e
crontab -u oracle -e

相关文章:

【Linux之升华篇】Linux内核锁、用户模式与内核模式、用户进程通讯方式

alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。字符设备描述符 struct cdev,cdev_alloc()用于动态的分配 cdev 描述符,cdev_add()用于注。外,还支持语义符合 Posix.1 标准的信号函数 sigaction(实际上,该函数是基于 BSD 的,BSD。从最初的原子操作,到后来的信号量,从。(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的。

Ubuntu下安装和配置Redis

找到 /ect/redis/redis.conf 文件修改如下:注释掉 127.0.0.1 ,如果不需要远程连接redis则不需要这个操作。使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG。默认情况下,Redis服务器不允许远程访问,只允许本机访问,所以我们需要设置打开远程访问的功能。执行sudo apt-get install redis-server 安装命令。查看 redis 是否启动,重新打开一个窗口。停止/启动/重启redis。

linux常用操作指令—— 查看磁盘、内存使用情况(df、du、free、top)

显示指定磁盘文件的可用空间。如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以 1KB为单位进行显示,除非环境变量 POSIXLY_CORRECT 被指定,那样将以512字节为单位进行显示。free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。当文件系统也确定删除了该文件后,这时候du与df就一致了。实例4:显示目前磁盘空间和使用情况 (最常用)top:“实时查看” ,按。退出 (实时动态显示)

Linux下netstat命令详解&&netstat -anp | grep 讲解

Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

Linux命令——根据端口号查进程

查出的数据第二列(16615)是elasticsearch的进程号。通常我们会根据端口号查进程号,或者通过进程号查端口号。linux环境下,我们常常会查询进程号pid。最常用ps -ef |grep xx。根据端口port查进程。根据端口port查进程。根据进程pid查端口。根据进程pid查端口。

Linux搜索文件&搜索文件名&替换文件内容

locate是Linux系统提供的一种快速检索全局文件的系统命令,它并不是真的去检索所以系统目录,而是检索一个数据库文件locatedb(Ubuntu系置/var/cache/locate/locatedb),该数据库文件包含了系统所有文件的路径索引信息,所以查找速度很快。time结尾的选项,其单位为天,min结尾的选项其单位为分钟,这些选项的值都为一个正负整数, 如+7,表示,7天以前被访问过的文件,-7表示7天以内被访问过的文件,7表示恰好7天前被访问的文件。:快速返回某个指定命令的位置信息。

[Ubuntu 22.04] Docker安装及使用

容器的生命周期由用户控制,用户可以选择手动删除容器或让其保留在系统中以供之后使用。选项允许你在容器内部创建一个交互式的终端会话,使你可以像在本地终端一样与容器进行交互。你可以在容器内执行命令,查看输出并输入命令。镜像拉取完成后,可以使用以下命令创建并启动一个基于 Ubuntu 20.04 镜像的容器。列出所有正在运行的容器,并显示它们的容器ID、镜像、命令、创建时间、状态等信息。以下命令可以中止容器,改命令将向容器发送一个停止信号,使其正常停止并退出。这将显示所有容器的列表,包括正在运行的和已停止的容器。

CSS局限属性contain:优化渲染性能的利器

在网页开发中,优化渲染性能是一个重要的目标。CSS局限属性contain是一个强大的工具,可以帮助我们提高网页的渲染性能。本文将介绍contain属性的基本概念、用法和优势,以及如何使用它来优化网页的渲染过程。

TCP服务器最多支持多少客户端连接

本文从理论和实际两个方面介绍了一个 TCP 服务器支持的最大连接数

C程序的内存空间布局(栈、堆、数据区、常量区、代码区)

较详细的介绍了栈、堆、数据区、常量区、代码区

给服务器开通telnet的流程

但一些特殊场景下,比如要升级ssh,ssh不能用时,需要使用telnet,用过要关闭此服务。需要首先安装,如果telnet-server服务在xinetd之前安装了,要先删除telnet-server,再安装xinetd。安装顺序:xinetd--》telnet--》telnet-server。安装顺序:xinetd--》telnet--》telnet-server。2、卸载rpm包(如果已经安装了,又不清楚顺序,可以都卸载后统一安装)注意:telnet-server服务启动依赖xinetd服务,

使用DockerFile构建镜像与镜像上传

首先Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像。

python基础小知识:引用和赋值的区别

通过引用,就可以在程序范围内任何地方传递大型对象而不必在途中进行开销巨大的赋值操作。不过需要注意的是,这种赋值仅能做到顶层赋值,如果出现嵌套的情况下仍不能进行深层赋值。赋值与引用不同,复制后会产生一个新的对象,原对象修改后不会影响到新的对象。如果在原位置修改这个可变对象时,可能会影响程序其他位置对这个对象的引用

k8s 使用tomcat官方镜像部署集群并解决访问页面404

官方镜像这里有个坑,使用kubectl启动之后,页面报错404,仔细检查发现,是因为tomcat的webapp目录下没有对应的文件,所以连初始界面都无法显示。要想显示,必须要根据官方镜像自己构建一个Dockerfile。根据上面的信息可以看出,该POD部署在k8s-node1上,映射POD的8080端口到master的30088端口上。这里需要将镜像上传到自己搭建的registry,并配置nodes节点都可以正常访问5000端口。三、根据官方镜像自己构建一个一次性就能启动的Tomcat镜像。

Centos系统上安装PostgreSQL和常用PostgreSQL功能

PostgreSQL安装成功之后,会默认创建一个名为postgres的Linux用户,初始化数据库后,会有名为postgres的数据库,来存储数据库的基础信息,例如用户信息等等,相当于MySQL中默认的名为mysql数据库。权限代码:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE、USAGE。为了方便我们使用postgres账号进行管理,我们可以修改该账号的密码。

linux切换root用户su - root和su root的区别

通过tty客户端登陆的shell就是login shell,通过在图形界面使用ctrl+shift+t的方式新建的shell是no login shell。登录的流程,会执行 /etc/profile,/etc/profile.d/下定义的*.sh都会执行。su - root,产生一个登录shell去执行后面的指令。no login shell 读取的文件和顺序为:/etc/bashrc和~/.bashrc。su root,产生一个非登录交互shell,非登录交互shell,只执行用户目录下。

Python中如何简化if...else...语句

我们通常在Python中采用if...else..语句对结果进行判断,根据条件来返回不同的结果,如下面的例子。这段代码是一个简单的Python代码片段,让用户输入姓名并将其赋值给变量user_input。我们能不能把这几行代码进行简化,优化代码的执行效率呢?以下是对各行代码的解读。这里使用了or这个逻辑运算符,当user_input不为空时,user_input为真,name就被赋于user_input的值。采用这种方法可以轻松实现if...else语句的简化。我们可以使用一行简短的代码来实现上面的任务。

轻松管理Linux磁盘空间命令:df

通过使用--output选项,可以自定义df命令的输出格式,选择显示的列以及它们的顺序。这对于筛选特定信息以便进一步处理非常有用。本文我们介绍了Linux系统上的df命令,包括基本用法、进阶用法、实际案例和场景应用,以及一些实用技巧和注意事项。df命令是系统管理中的一个重要工具,能够帮助用户有效管理磁盘空间,预防和解决潜在问题。在实际使用中,请根据具体情况选择合适的df命令选项和参数,并结合其他命令,以获取更全面的系统信息。

Docker网络配置&网络模式

网络相关概念,子网掩码、网关、规则的介绍及网络模式bridge、host详解,Dockers自定义网络配置

Linux grep命令教程:强大的文本搜索工具(附案例详解和注意事项)

grep(Global Regular Expression Print)命令用来在文件中查找包含或者不包含某个字符串的行,它是强大的文本搜索工具,并可以使用正则表达式进行搜索。当你需要在文件或者多个文件中搜寻特定信息时,grep就显得无比重要啦。

保持Python程序在Linux上持续运行的几种方法

主要是用来定时执行任务的,但你也可以利用它来监控你的Python脚本是否正在运行,并在需要时重新启动它。是一个非常实用的命令,它可以让你的Python脚本在你退出shell后继续运行。总结起来,根据你的具体需求和环境,你可以选择以上任何一种方法来保持Python程序在Linux上的持续运行。使用这些工具,你可以随时断开SSH连接,而不用担心脚本会停止运行。通过这种方式,你可以安全地关闭终端,而脚本会继续在后台执行。这样,你的Python脚本就会作为系统服务运行,并且会在系统启动时自动启动。

linux环境中一次启动多个jar包,并且设置脚本开机自启

我们在通过jar启动项目时,有时候会比较多,启动会比较麻烦,需要编写shell脚本启动,将启动脚本存放在需要启动的jar包路径下。(文档存放在 /home/process_parent )PORTS 端口号,多个用空格隔开MODULES 模块,多个用空格隔开MODULE_NAMES 模块名称,多个用空格隔开。

windows11通过虚拟机安装Ubuntu20.04

window11通过虚拟机VMware Workstation 17 Player安装ubuntu20.04

开发版ubuntu系统上如何进行开机自启(四种方法一览)

如果省略该字段,则 systemd 将默认将当前服务的启动顺序设置为与其他服务无关,即在启动过程中没有任何依赖性关系,服务的启动顺序由系统自行决定。【ExecStart】 关键字段,服务启动命令,指定服务启动时需要执行的命令或脚本【WantedBy】用于指定服务的自动启动级别,在 Linux 系统中,多用户模式是指允许多个用户同时登录并使用系统资源的模式,与之相对的是单用户模式,只有一个用户可以登录并使用系统资源。保存文件的方法根据所使用的编辑器而有所不同,通常是按下特定的键组合,然后选择保存并退出。

你了解计算机网络的发展历史吗?

计算机网络是指将一群具有独立功能的计算机通过被互联起来的,在通信软件的支持下,实现的系统。计算机网络是计算机技术与通信技术紧密结合的产物,两者的迅速发展渗透形成了计算机网络技术。简而言之呢,计算机网络就是实现两台计算机相互沟通的介质。

Linux安装MongoDB教程

将解压后的 mongodb-linux-x86_64-rhel70-4.2.23 中的所有文件全部移动到 /usr/local/mongodb 中 :注意/*是所有子文件。也可以不用设置环境变量进行启动,但是不设置环境变量启动的话要每次启动写很多启动参数,比较麻烦,所以做好配置环境变量。在 mongodb 下创建 data 和 logs 目录,以及日志文件mongodb.log。在 /usr/local 目录中创建 mongodb 文件夹。启动 MongoDB(-conf 使用配置文件方式启动)

Linux之后台执行命令:nohup和&的使用

如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。command>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到out.file文件中。作业在后台运行的时候,可以把输出重定向到某个文件中,相当于一个日志文件,记录运行过程中的输出。将sh test.sh任务放到后台,但是依然可以使用标准输入,

CentOS 7 设置 Jar包、MinIO、Nginx 开机自启动

根据需要,自己修改 Description 和 ExecStart 的内容即可(ExecStart后面的java命令需要全路径)ExecStart 服务运行执行的命令,放上面创建的脚本位置。[Install] 服务安装的相关设置,可设置为多用户。如果用 yum install 命令安装的,如果使用源码手动编译的则需要手动创建。文件,xxx 就是自定义的服务名称。After:设置在某个服务启动后启动。Description:服务的描述。可以使用这个命令来查看服务启动日志。里面的环境变量是必须的,将。

Linux系统中Java new Date()的时间和系统时间不一致

出现问题:new Date(),的时间和当前时间不一样,发现差了8小时,看到8小时就应该明白了,时区的问题。

linux中&和&&,|和||及分号(;)的用法

在linux中,我们经常会用到&和&&,|和||及分号,但是好多人对其会混淆,不明白其中的意思,今天为大家讲解一下&和&&,|和||及分号(;)各自的说明和用法。