NTP SER

ntp server 安装

安装

sudo apt-get install ntp

启动服务

sudo systemctl start ntp.service

查看服务状态

sudo systemctl status ntp.service

停止服务

sudo systemctl stop ntp.service

时间同步命令

sudo ntpdate ip_addr

为了防止出现一些问题,还要编辑/etc/ntp.conf,加入:
server 127.127.1.0
fudge 127.127.1.0 stratum 8
主要是解决同步时出现 no server suitable for synchronization found错误。

安装ntpd后,在本机运行ntpdate出错,如下:
ntpdate[19979]: the NTP socket is in use, exiting
在执行命令,添加-u选项即可,比如:
ntpdate -u 202.120.2.101
ntpdate -u 133.100.11.8

主节点配置文件ntp_master.conf

driftfile /var/lib/ntp/drift

statsdir /var/log/ntpstats/

#下面默认是拒绝所有来源的任何访问
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

#开放本机的任何访问
restrict 127.0.0.1
restrict ::1

#允许上层时间服务器主动修改本机时间(当前节点)
restrict 192.168.81.131 nomodify notrap noquery
# 允许内网其他机器同步时间(允许网段主机进行时间同步)
restrict 192.168.81.255 mask 255.255.255.0 nomodify notrap

#外部时间服务器不可用时,以本地时间作为时间服务
server  127.127.1.0
fudge   127.127.1.0 stratum 10

二、客户端配置
1.安装ntpdate
sudo apt-get install ntpdate
2.手动校时
sudo ntpdate 192.168.81.131
3.编辑crontab
sudo vim /etc/crontab

追加一行,保存。
*/1 * * * * root sudo ntpdate 192.168.81.131 //使用root用户一分钟自动对时一次

compose

    compose_version = '1.0.2'
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.activity:activity-ktx:1.3.1'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "androidx.compose.ui:ui-util:$compose_version"

Text()
Image(painter = painterResource(id = R.drawable.ic_launcher_foreground), contentDescription = “无障碍说明”)
//bitmap Bitmap ImageBitmap 位图 ImageVector矢量图 Painter painterResource()

https://github.com//google/accompanist
implementation ‘dev.chrisbanes.accompanist:accompanist-coil:0.6.2’
CoilImage(data = “”,contentDescription = “”)

Modifier

    Box() {

    }
    Column() {
        上下
    }
    Row() {
        左右
    }

thymeleaf

thymeleaf

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<p th:text="#{home.welcome}">welcome</p>
<p data-th-text="#{home.welcome}">welcome</p>

娈量表达式 ${}
消息表达式 #{}
选择表达式 *{} 在当前变量表达式中取值
链接表达式 @{} @{../} @{~/} @{//} @{http://}
分段表达式 th:insert th:replace  th:include(不推荐使用)
文本 th:text
比较 >gt <lt >=ge <=le ==eq !=ne
无操作 _ ?:_
设置属性值 th:attr="action=@{/subscribe}"
迭代器 th:each <li th:each="book : ${books}" th:text="${book.title}">en</li>
    状态变量 index(从0开始),count,size,current,even/odd(奇偶数),first,last
条件 th:if th:unless th:switch th:case
片段定义 <div th:fragment="copy">  <div th:insert="~{footer::copy}"></div>
        <div id="copy">  <div th:insert="~{footer::#copy}"></div>
解析器级注释 <!--/* */-->
原型注释块 <!--/*/ /*/-->
内联表达式 [[]] th:text [()]th:utext 禁用内联 th:inline="none"
基本对象 #ctx #local #request #session #selrvletContext param/session/application

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.0.0'

log日志

日志门面
JCL
*SLF4J
jboos-logging

日志实现
Log4j
Log4j2
*Logback
JUL

日志文件配制

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-context</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>

application.yml

logging:
  pattern:
    console: "%d - %msg%n"
  file:
    path: /log/weixin

logback-spring.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration >
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制台日志显示-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d - %msg%n
            </pattern>
        </layout>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--文件非ERROR日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--禁止ERROR日志-->
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略 按时间每天一个日志文件-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径-->
            <fileNamePattern>
                /log/weixin/info.%d.log
            </fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--文件ERROR日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--仅ERROR日志-->
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %d - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略 按时间每天一个日志文件-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径-->
            <fileNamePattern>
                /log/weixin/error.%d.log
            </fileNamePattern>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>

MinIO

docker run -itd -p 9000:9000 --name minio1 \
  --restart=always \
  -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \
  -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
  -v /mnt/data:/data \
  -v /mnt/config:/root/.minio \
  minio/minio server /data

springboot定时任务

1:
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>

2:
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

3.
 <!--http://www.hutool.cn/-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.1</version>
        </dependency>

portainer docker图形化管理工具

https://www.portainer.io/
https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/

docker volume create portainer_data

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

docker run -p 9000:9000 -p 8000:8000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /portainer/data:/data -d portainer/portainer

 -v "/var/run/docker.sock:/var/run/docker.sock" (Linux).
or
-v \\.\pipe\docker_engine:\\.\pipe\docker_engine (Windows).

定时任务处理

如果发现您的系统里没有这个命令,请安装下面两个软件包.
vixie-cron
crontabs

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

crontab在/etc目录下面存在cron.d,cron.daily,cron.weekly,cron.monthly,cron.hourly五个目录和crontab文件。

cron.d是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面。

如果是按小时,按天,按星期,按月的来执行的话,则可以放到相应的目录下面去。
cron.hourly是每个小时执行一次的任务
cron.daily是每天执行一次的任务
cron.weekly是每个星期执行一次的任务
cron.monthly是每月执行一次的任务

常用参数:
crontab -l //查看当前用户下的cron任务
crontab -e //编辑当前用户的定时任务
crontab -u linuxso -e //编辑用户linuxso的定时任务
安装:apt-get install cron
启动:service cron start
重启:service cron restart
停止:service cron stop
检查状态:service cron status
查看cron是否运行 ps -ef | grep cron
查询cron可用的命令:service cron
检查Cronta工具是否安装:crontab -l

具体用法和格式:
基本格式 :
        *  command
分 时 日 月 周 命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

例子
crontab -e
添加这一句
15 2 * * * reboot
然后重启:/etc/init.d/cron restart

通过man crontab可以查看到下面的信息
(1)/etc/crond.allow 表示的是允许使用crontab的用户列表
(2)/etc/crond.deny 表示的是不允许使用crontab的用户列表