Reboot Task

最简单/etc/rc.lo­cal

默认是不开启的,文件/etc/rc.lo­cal默认也不存在

开启/etc/rc.lo­cal功能

  • ubuntu18.04不再使用initd管理系统,改用systemd
  • systemd有rc-local的配置文件,只需链接到/etc/systemd/system目录下启动即可
    • ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

使用/etc/rc.lo­cal功能

1
2
3
4
touch /etc/rc.local
chmod 755 /etc/rc.local
vim /etc/rc.local
eg. #!/bin/bash echo "test rc " > /var/test.log

crontab @reboot

1
2
crontab -e
@reboot /home/user/test.sh

initd 启动管理系统

  • init.d目录包含许多系统各种服务的启动和停止脚本。它控制着所有从acpid到x11-common的各种事务。
  • 注意:ubuntu18.04不再使用initd管理系统,改用systemd

编写脚本

  • /etc/init.d目录下建立文件test
    • 按照README编写脚本
    • 赋予执行权限sudo chmod +x /etc/init.d/test

设置脚本启动

方法一:使用update-rc.d 命令将脚本放到启动脚本中去(debian中可以使用更新的insserv):

1
2
$ cd /etc/init.d
$ sudo update-rc.d test defaults 95

注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。更多说明建议看man update-rc.d。

方法二:手动在rc*.d中建立软连接

1
$ ls -s test ../rc5.d/S95test

rc*.d,*代表启动级别,在不同启动级别启动,
K开头的脚本文件代表运行级别加载时需要关闭的,
S开头的代表相应级别启动时需要执行,
数字代表顺序

卸载启动脚本的方法:

1
2
$ cd /etc/init.d
$ sudo update-rc.d -f test remove

手动调用脚本

1
2
3
/etc/init.d/test start
/etc/init.d/test stop
/etc/init.d/test restart

systemd 服务管理系统

使用sudo systemctl enable xxx

1
2
3
4
5
6
7
8
9
systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable *.service #开机运行服务
systemctl disable *.service #取消开机运行
systemctl start *.service #启动服务
systemctl stop *.service #停止服务
systemctl restart *.service #重启服务
systemctl reload *.service #重新加载服务配置文件
systemctl status *.service #查询服务运行状态
systemctl --failed #显示启动失败的服务

systemctl 开机启动原理

  • Systemd 默认从目录/etc/systemd/system/读取配置文件。
  • 但是,里面存放的大部分文件都是符号链接,指向目录
    • /usr/lib/systemd/system/,真正的配置文件存放在那个目录。

systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

1
2
3
4
> $ sudo systemctl enable [email protected]
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/[email protected]' '/etc/systemd/system/multi-user.target.wants/[email protected]'
>
  • 如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。
  • 与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。
    1
    2
    > $ sudo systemctl disable [email protected]
    >
  • 配置文件的后缀名,就是该 Unit 的种类,比如sshd.socket
    • 如果省略,Systemd 默认后缀名为.service,所以sshd会被理解成sshd.service

把程序设置systemctl服务,并开机启动

进入目录/usr/lib/systemd/system,修改webhook.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=Webhook receiver for GitHub

[Service]
Type=simple
ExecStart=/usr/local/bin/webhook

[Install]
WantedBy=multi-user.target

这里有几个模块:

  • [Unit] 区块:启动顺序与依赖关系。
  • [Service] 区块:启动行为,如何启动,启动类型。
  • [Install] 区块,定义如何安装这个配置文件,即怎样做到开机启动。
1
2
systemctl start nexus.service  #启动服务
systemctl enable nexus.service #设置开机启动

Loaded: loaded (/etc/systemd/system/webhook.service; enabled;这个enabled就是开机启动的意思

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://neucrack.com/p/91

Linux Auto Run : crontab

crontab的使用

任务调度

Linux下的任务调度分为两类:系统任务调度和用户任务调度。

Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。

crontab 命令

1
2
crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
  • -u user:用于设定某个用户的crontab服务;
  • file: file为命令文件名,表示将file作为crontab的任务列表文件并载入crontab;
  • -e:编辑某个用户的crontab文件内容,如不指定用户则表示当前用户;
  • -l:显示某个用户的crontab文件内容,如不指定用户则表示当前用户;
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

crontab文件

  • crontab有2种编辑方式:
    • 直接编辑/etc/crontab文件,其中/etc/crontab里的计划任务是系统中的计划任务,
    • 通过crontab –e来编辑用户的计划任务;
      • 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
      • 所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
  • crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。
  • 新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。
  • %在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用\%来进行转义。

配置文件实例:

1
2
3
4
5
6
7
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
MAILTO=root # MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
# * * * * * user-name command to be executed
@reboot /home/user/test.sh #可以实现开机自动运行
@reboot sleep 300 && /home/start.sh # 延时启动

@reboot 表示重启开机的时候运行一次。还有很多类似参数如下:

1
2
3
4
5
6
7
8
9
10
string             meaning
------ -----------
@reboot Run once, at startup.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnight (same as @daily)
@hourly Run once an hour, "0 * * * *".
1
2
3
4
5
6
7
8
9
10
# 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
# | | | | |

* */1 * * * /etc/init.d/smb restart # 每一小时重启smb

在以上各个字段中,还可以使用以下特殊字符:

  • *代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;
  • /代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。
  • -代表从某个区间范围,是闭区间。如2-5表示2,3,4,5
    • 组合:小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。
  • ,分散的数字(不一定连续),如1,2,3,4,7,9

查看crontab的日志记录和状态

tail -f /var/log/cron观察查看cron运行日志(/var/log/cron.log),但是并未找到相关文件,原因是ubuntu默认没有开cron日志,执行命令:

1
sudo vim /etc/rsyslog.d/50-default.conf

找到cron.log相关行,将前面注释符#去掉,保存退出,重启rsyslog:

1
sudo  service rsyslog  restart

执行less -10 /var/log/cron.log再次查看cron运行日志,log出来了,提示如下信息:

1
No MTA installed, discarding output

原因是cron把屏幕输出都发送到email了,而当前环境并未安装email server,于是系统报错,解决方面就是不要直接向屏幕输出内容,而是重定向到一个文件。

1
2
cd /var/spool/mail/
less shaojiemike
1
service cron status # ubuntu

实例

夜间利用机器进行批量实验

如果Linux系统有时差,需要加8小时在0、3、6点。

1
0 0,3,6 * * * cd /home/t00906153/OpenSora/OpenSora_performance_test && git stash save "Stash before script run at $(date +"%Y-%m-%d %H:%M:%S")" && bash test/train_full_opensorav1_1.sh >> /home/t00906153/crontab.log 2>&1 && git stash pop && echo "Executed at $(date)" >> /home/t00906153/crontab.log

crontab on OpenWRT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 1.编辑好脚本加入cron

crontab -e
* * * * * sh /root/tst.sh

# 2.创建cron初始化脚本 vi /etc/init.d/S60cron,添加下面内容

#!/bin/sh
#start crond
/usr/sbin/crond -c /etc/crontabs

# 修改权限
chmod 755 /etc/init.d/S60cron

# 3.手动启动crond
/etc/init.d/S60cron

# 4.查看crond任务
logread -e cron

# 5.重启crond
killall crond; /etc/init.d/S60cron

# 6.禁用crond日志 修改/etc/init.d/S60cron
/usr/sbin/crond -c /etc/crontabs -L /dev/null

其他自动化方法

https://zhuanlan.zhihu.com/p/35402730

https://blog.csdn.net/qq_35440678/article/details/80489102

https://neucrack.com/p/91

开题缘由、总结、反思、吐槽~~

参考文献

https://www.linuxprobe.com/how-to-crontab.html

https://martybugs.net/wireless/openwrt/cron.cgi