添加开机自启任务介绍:

  • 前言:
  • 1、写脚本来执行要做的操作,将脚本加到系统的开机自启systemctl任务进程里面,这里启动起来的是root用户进程,这个启动起来之后可以在后头进程里面看到。
  • 2、写脚本来执行要做的操作,将脚本加到普通用户的的开机自启任务进程里面,这里启动起来的是普通用户进程。这个可以专门起一个终端来显示看到。
  • 3、 比如这里添加一个定时程序:
  • 3.1、crontab编辑器选错后的解决方法:
  • 3.2、corntab详细说明


前言:

有时候需要一些开机自启的任务或者定时重启任务,把程序过一段时间重启一次。有两种办法:

1、写脚本来执行要做的操作,将脚本加到系统的开机自启systemctl任务进程里面,这里启动起来的是root用户进程,这个启动起来之后可以在后头进程里面看到。

systemctl里面添加自启任务,需要如下几个文件,文件和脚本自己创建:
文件介绍:

1.1、忽略名字问题,run.sh脚本内容如下:

Linux系统开机emergency mode linux系统开机自启动程序_linux


1.2、helloword-OD@.service内容:

.service文件定义了一个服务,分为[Unit],[Service],[Install]三个小节

	[Unit]
	Description="helloword object detection %i"		服务进程描述,写有意义的内容,便于识别
	Requires=network.target senseshield.service		当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败,定义启动顺序
	After=network.target senseshield.service		在network.target,senseshield.service启动后才启动
	PartOf=helloword-OD.target						 
						BindTo与 Requires 相似,但是一种更强的关联。启动这个服务时会同时启动列出的所有模块,当有模块启动失败时终止当前服务。
							反之,只要列出的模块全部启动以后,也会自动启动当前服务。并且这些模块中有任意一个出现意外结束或重启,这个服务会跟着终止或重启。
						PartOf这是一个 BindTo 作用的子集,仅在列出的任何模块失败或重启时,终止或重启当前服务,而不会随列出模块的启动而启动。


	[Service]WorkingDirectory=/home/nvidia/.config			#设置应用的工作目录
	ExecStart=/bin/bash helloword_run.sh						执行启动脚本,指定启动单元的命令或者脚本,
			ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
	Restart=on-failure								fail时重启,这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。

1.3、helloword-OD.target内容:

.target定义了一些基础的组件,供.service文件调用
 
	[Unit]
	Description="helloword object detection %i"		简短描述,服务描述,写有意义的内容,便于识别
	Requires=helloword-OD@1.service					当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
	#Requires=helloword-OD@{1..2}.service
	#After=network.target senseshield.service

	[Install]
	WantedBy=multi-user.target			它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中,单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息

1.4、创建好前面两个文件跟脚本之后:
将helloword-OD.target拷贝到系统/etc/systemd/system目录下,

cp helloword-OD.target helloword-OD@.service /etc/systemd/system

给复制过来的之两个文件添加执行权限:

sudo chmod +x helloword-OD.target helloword-OD@.service

执行命令添加helloword-OD.target,作用是会把helloword-OD.target添加在系统自启动项中。

sudo systemctl enable helloword-OD.target

1.5、这里可以用到的几个命令写一下:

程序自启动从启动项取消(关机重启就不在了):sudo systemctl disable helloword-OD.target
程序自启动添加到启动项(关机重启还在):sudo systemctl enable helloword-OD.target
关闭当前程序自启动(只关闭当前进程):sudo systemctl stop helloword-OD.target
开启当前程序自启动(只开启当前进程):sudo systemctl start helloword-OD.target

2、写脚本来执行要做的操作,将脚本加到普通用户的的开机自启任务进程里面,这里启动起来的是普通用户进程。这个可以专门起一个终端来显示看到。

1、比如我添加一个开机自启创建一个叫helloword.txt的任务,就使用helloword-od.desktop文件来实现这个文件夹你自交创建一个就行,内容如下:

Linux系统开机emergency mode linux系统开机自启动程序_运维_02


忽略名字问题,run.sh脚本内容如下:

Linux系统开机emergency mode linux系统开机自启动程序_linux

2、将这个helloword-od.desktop文件放在home目录下的隐藏文件有一个叫  “.config”的隐藏文件夹。他里面有一个叫autostart这个文件里面。这文件是系统自带的。

Linux系统开机emergency mode linux系统开机自启动程序_linux_04


要是自己的这个.config里面没有auto_start这个文件夹,就自己创建一个,名字就叫auto_start。

Linux系统开机emergency mode linux系统开机自启动程序_ubuntu_05

3、放进去之后,确认helloword-od.desktop文件内容和目录路径正确,然后在终端使用:
	gnome-session-properties
	进入之后,勾选bash run.sh 并退出。
	就完成了,每次开机自启都会在helloword_run.sh脚本所在的文件夹里面创建一个叫helloword.txt的文本。

3、 比如这里添加一个定时程序:

除了使用桌面自启动程序之外还要使用linux上面的crontab来添加程序定时重新启动。
1、在终端使用        crontab -e

1、编辑crontab文件,用来存放你要执行的命令
        sudo crontab -e 

2、第一次用这个命令,会让你选择文本编辑器,我选的是vim
    (输入数字选择就是了!)

3:在这个文件最后面最后一行添加执行命令
    每天的00点00分执行这个/home/user/workspace/helloword_auto_start路径下面的helloword_run.sh脚本并将结果输出到log.txt。
    00 00 * * * cd /home/user/workspace/helloword_auto_start; bash helloword_run.sh > log.txt
4、还需要在helloword_run.sh里面最后一行前一行加上:    
	export DISPLAY=:0

5:重启cron来应用这个计划任务
    sudo service cron restart

6、使用这个命令来查看是否有执行重启或者查看自己将输出重定向到txt文本的内容或者看进程名字是否有重启。   watch -n .5 "sudo systemctl status cron.service"

3.1、crontab编辑器选错后的解决方法:

方法一:
vim ~/.bashrc
在文件最后面添加以下代码,保存退出
export EDITOR=/usr/bin/vim
然后生效配置
source ~/.bashrc

方法二:
select-editor

3.2、corntab详细说明

1、crontab文件的基本格式如下所示

 *  * * * * command
分 时 天 月 周 命令

1、crontab中的每一行代表一个定期执行的任务,分为6个部分。前5个部分表示何时执行命令,最后一个部分表示执行的命令。每个部分以空格分隔,除了最后一个部分(命令)可以在内部使用空格之外,其他部分都不能使用空格。前5个部分分别代表:分钟,小时,天,月,星期,每个部分的取值范围如下:

分钟 0 - 59
小时 0 - 23
天 1 - 31
月 1 - 12
星期 0 - 6 0表示星期天
* (星号) 表示任意值,比如在小时部分填写 * 代表任意小时(每小时)
,(逗号) 可以允许在一个部分中填写多个值,比如在分钟部分填写 1,3 表示一分钟或三分钟
/(斜线) 一般配合 * 使用,代表每隔多长时间,比如在小时部分填写 /2 代表每隔两分钟。所以 /1 和 * 没有区别

2:crontab例子

(1)30 20 * * * date >> /home/date.log //每天的20:30将日期信息追加home目录下的date.log中
(2)5 20 13,14 * * date >> /home/date.log //每月的13日,14日20:5分将日期信息最追加home目录下的date.log中
(3)0,10 10,12 * * * date >> /home/date.log //每天10点至12点之间,隔10分钟将日期信息最追加home目录下的date.log中
(4)/5 * * * date >> /home/date.log //每5分钟将日期信息最追加home目录下的date.log中

3:crontab是UNIX系统下定期执行任务的触发器。用户把要定期执行的任务记录在这个文件下面,然后crond定期的去检查这个定期执行列表,有要执行的工作时便自动执行。
通过man crontab可以查看到下面的信息

(1)/etc/crond.allow 表示的是允许使用crontab的用户列表
(2)/etc/crond.deny 表示的是不允许使用crontab的用户列表

4: crontab常用的几个命令格式

crontab -l //显示用户的crontab文件的内容
crontab -e //编辑用户的crontab文件的内容
crontab -r //删除用户的crontab文件

1、 计划任务,crontab命令选项:
 	-u指定一个用户,
 	-l列出某个用户的任务计划,
 	-r删除某个用户的任务,
	-e编辑某个用户的任务

2、cron文件语法:

分     小时   日       月       星期     命令

    0-59   0-23   1-31   1-12     0-6     command   
	
	可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件