【Linux相識相知】任務計劃和周期性任務

来源:http://www.cnblogs.com/liubinsh/archive/2017/09/05/7477461.html
-Advertisement-
Play Games

本文主要講解了linux下的at命令的使用和周期性任務計劃crond的用法。 ...


在我們的生活中,有的工作是例行的,例如每年一次加薪、每年給女朋友過一次生日、每天上班都要打卡等,有的工作是臨時發生的,例如明天朋友要來訪,你需要準備午餐等等。

像很多例行的工作,你一旦忙起來就很容易忘記,這時候就需要人去提醒你,linux的crontab功能就能夠排上用場了,例如每年女朋友的生日前一天給你發個郵件提醒你,好讓你有所準備。臨時發生的事情,例如上面那個例子,明天朋友要來訪,在第二天的上午給你發一封郵件提醒你要精心準備午餐。這時候linux的at功能就能派上用場了。那他們之間有什麼不一樣呢?真的有這麼牛x嗎?下麵我們就來一起看看吧!

 

at和crontab簡介

at:一般用於未來某一個時間點去執行一次某某任務,要記住,只執行一次,所有at很適合那些臨時的任務;

crontab:周期性的去運行某任務,所以適合那些周期性的任務。

 

電子郵件服務

在寫at和crontab之前,我們先來簡單的看一下本地的電子郵件服務----mailx,mailx的用途就是用來發送和接受網路郵件。

用法(這裡只簡單的談一下,以便後面介紹at和crontab,詳細的可以見man手冊):

mailx  [-s 'SUBJECT']  username[@hostname]    #使用mail也可以

每個用戶在/var/spool/mail/目錄下都有一個以自己名字命令的"郵筒",可以用來接收郵件!

1.通過互動式的方式生成郵件正文,我們讓root用戶給frank用戶發個郵件:

[root@localhost ~]# mailx -s "hello frank"  [email protected]  #-s指定郵件標題,本地用戶@hostname可以去掉
how are you?
I am root!
.
EOT

frank用戶收郵件:

[frank@localhost ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/frank": 1 message 1 new
>N  1 root                  Mon Sep  4 11:43  19/654   "hello frank"
& 1                                         #輸入序號即可查看文件內容
Message  1:
From [email protected]  Mon Sep  4 11:43:30 2017
Return-Path: <[email protected]>
X-Original-To: [email protected]
Delivered-To: [email protected]
Date: Mon, 04 Sep 2017 11:43:30 -0400
To: [email protected]
Subject: hello frank     #郵件標題
User-Agent: Heirloom mailx 12.5 7/5/10     #用戶收發郵件的工具程式
Content-Type: text/plain; charset=us-ascii
From: [email protected] (root)
Status: R

how are you?                  #郵件正文
I am root!
2.使用輸入重定向來生成郵件正文,讓frank給root回一封,這裡可以將文件直接發給root用戶。 我們將/tmp/下寫好的的hello.txt文件發給root:
[frank@localhost tmp]$ mailx -s "hello root" root  < /tmp/hello.txt  #這裡我們省去了hostname

root收郵件並查看:

[root@localhost ~]# 
You have mail in /var/spool/mail/root     #看吧!這裡會彈出提示,告訴你有一封郵件!
[root@localhost ~]# 
[root@localhost ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 frank                 Mon Sep  4 11:56  19/629   "hello root"
& 1
Message  1:
From [email protected]  Mon Sep  4 11:56:31 2017
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Date: Mon, 04 Sep 2017 11:56:31 -0400
To: [email protected]
Subject: hello root
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: [email protected] (frank)
Status: R

I am ok!
and you?

& q    #q退出
Held 1 message in /var/spool/mail/root
3.通過管道生成郵件正文,讓root給frank再回一封郵件: 事先準備好了hello2.txt
[root@localhost ~]# cat /tmp/hello2.txt | mail -s "hey Frank" frank  #使用mail和mailx都是可以的

frank來收郵件查看:

[frank@localhost tmp]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/frank": 2 messages 1 new
    1 root                  Mon Sep  4 11:43  20/665   "hello frank"
>N  2 root                  Mon Sep  4 12:05  19/622   "hey Frank"
& 2
Message  2:
From [email protected]  Mon Sep  4 12:05:27 2017
Return-Path: <[email protected]>
X-Original-To: frank
Delivered-To: [email protected]
Date: Mon, 04 Sep 2017 12:05:27 -0400
To: [email protected]
Subject: hey Frank
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: [email protected] (root)
Status: R

I am fine too!

好了,郵件服務就暫時寫到這裡,想要瞭解的更詳細可見參考man手冊,下麵我們就來進入正式的主題吧!

 

at命令

at命令一般用於臨時的任務,只會執行一次,at執行的結果都會以郵件的形式發給提交作業的用戶。

語法: at [OPTION]... TIME
選項:
    -l:查看作業隊列,相當於atq
    -f /path/from/somefile:從指定的文件讀取作業任務,而不是互動式的輸入
    -d:刪除指定的作業,相當於atrm
    -c:查看指定作業的具體內容
    -q:指定隊列
TIME:
   精確的時間:HH:MM [YYYY-mm-dd]    00:13 2017-09-05
   模糊的時間:noon,midnight,teatime,tomorrow
   加:now + #      now + 5 minutes  5分鐘後,單位有:minutes  hours days weeks

下麵我們就來使用:

[root@localhost ~]# at  now + 2 minutes
at> cat /etc/passwd
at> <EOT>      #輸入<EOT>或者使用ctrl+d
job 6 at Mon Sep  4 12:26:00 2017

2分鐘後我們收到一封郵件:

[root@localhost ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 4 messages 1 unread
    1 frank                 Mon Sep  4 11:56  20/640   "hello root"
    2 root                  Mon Sep  4 12:21  17/596   "Output from your job        2"
    3 root                  Mon Sep  4 12:24  15/514   "Output from your job        3"
>U  4 root                  Mon Sep  4 12:26  36/1561  "Output from your job        6"
& 4
Message  4:
From [email protected]  Mon Sep  4 12:26:00 2017
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Subject: Output from your job        6
To: [email protected]
Date: Mon,  4 Sep 2017 12:26:00 -0400 (EDT)
From: [email protected] (root)
Status: RO

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
....(略)

查看作業隊列:

[root@localhost ~]# at -l   #也可以使用atq
7    Mon Sep  4 12:29:00 2017 a root

從指定的文件去讀取作業任務:

[root@localhost ~]# at -f myat.txt  12:36
job 9 at Mon Sep  4 12:36:00 2017
[root@localhost ~]# atq   #查看作業隊列,相當at -l
9    Mon Sep  4 12:36:00 2017 a root 

使用-c查看指定作業的具體內容:

[root@localhost ~]# at -c 10
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=9; export XDG_SESSION_ID
HOSTNAME=localhost.localdomain; export HOSTNAME
SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=192.168.122.1\ 62021\ 22; export SSH_CLIENT
SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
SSH_TTY=/dev/pts/0; export SSH_TTY
USER=root; export USER
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=40\;31\;01:mi=01\;05\;37\;41:su=37\;41:sg=30\;43:ca=30\;41:tw=30\;42:ow=34\;42:st=37\;44:ex=01\;32:\*.tar=01\;31:\*.tgz=01\;31:\*.arc=01\;31:\*.arj=01\;31:\*.taz=01\;31:\*.lha=01\;31:\*.lz4=01\;31:\*.lzh=01\;31:\*.lzma=01\;31:\*.tlz=01\;31:\*.txz=01\;31:\*.tzo=01\;31:\*.t7z=01\;31:\*.zip=01\;31:\*.z=01\;31:\*.Z=01\;31:\*.dz=01\;31:\*.gz=01\;31:\*.lrz=01\;31:\*.lz=01\;31:\*.lzo=01\;31:\*.xz=01\;31:\*.bz2=01\;31:\*.bz=01\;31:\*.tbz=01\;31:\*.tbz2=01\;31:\*.tz=01\;31:\*.deb=01\;31:\*.rpm=01\;31:\*.jar=01\;31:\*.war=01\;31:\*.ear=01\;31:\*.sar=01\;31:\*.rar=01\;31:\*.alz=01\;31:\*.ace=01\;31:\*.zoo=01\;31:\*.cpio=01\;31:\*.7z=01\;31:\*.rz=01\;31:\*.cab=01\;31:\*.jpg=01\;35:\*.jpeg=01\;35:\*.gif=01\;35:\*.bmp=01\;35:\*.pbm=01\;35:\*.pgm=01\;35:\*.ppm=01\;35:\*.tga=01\;35:\*.xbm=01\;35:\*.xpm=01\;35:\*.tif=01\;35:\*.tiff=01\;35:\*.png=01\;35:\*.svg=01\;35:\*.svgz=01\;35:\*.mng=01\;35:\*.pcx=01\;35:\*.mov=01\;35:\*.mpg=01\;35:\*.mpeg=01\;35:\*.m2v=01\;35:\*.mkv=01\;35:\*.webm=01\;35:\*.ogm=01\;35:\*.mp4=01\;35:\*.m4v=01\;35:\*.mp4v=01\;35:\*.vob=01\;35:\*.qt=01\;35:\*.nuv=01\;35:\*.wmv=01\;35:\*.asf=01\;35:\*.rm=01\;35:\*.rmvb=01\;35:\*.flc=01\;35:\*.avi=01\;35:\*.fli=01\;35:\*.flv=01\;35:\*.gl=01\;35:\*.dl=01\;35:\*.xcf=01\;35:\*.xwd=01\;35:\*.yuv=01\;35:\*.cgm=01\;35:\*.emf=01\;35:\*.axv=01\;35:\*.anx=01\;35:\*.ogv=01\;35:\*.ogx=01\;35:\*.aac=01\;36:\*.au=01\;36:\*.flac=01\;36:\*.mid=01\;36:\*.midi=01\;36:\*.mka=01\;36:\*.mp3=01\;36:\*.mpc=01\;36:\*.ogg=01\;36:\*.ra=01\;36:\*.wav=01\;36:\*.axa=01\;36:\*.oga=01\;36:\*.spx=01\;36:\*.xspf=01\;36:; export LS_COLORS
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
PWD=/root; export PWD
LANG=en_US.UTF-8; export LANG
SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
SSH_CONNECTION=192.168.122.1\ 62021\ 192.168.122.128\ 22; export SSH_CONNECTION
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
cd /root || {
     echo 'Execution directory inaccessible' >&2
     exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER02cdeaba'
echo "hello"
cat /tmp/hello.txt
cat /etc/passwd
具體內容 這裡包括了很多的環境變數,大家可以註意一下這裡的PATH,有的情況我們運行的命令不在這個PATH所包含的路徑下麵,所以寫在作業裡面的命令建議使用絕對路徑。 在/etc/目錄下有這麼一個文件,at.deny,寫在這個文件裡面的用戶是不能使用at的。有的情況下不存在at.deny而是存在at.allow,那麼只有在at.allow裡面的用戶才能使用at,如果兩個文件都不存在的話,則只用root用戶可以使用at。 除了at命令以外,還有命令是batch,batch會讓系統自行選擇在系統資源較空閑的時候去執行指定的任務(when the load average drops below 0.8, or the value specified in the invocation of atd.)大致意思就是當平均負載低於0.8的時候。 可以使用uptime查看平均工作負載(CPU在單位時間點里所負責的工作數量):如果一個程式一直讓CPU進行不停的運算,那麼此時CPU的工作負載可能就已經達到了100%,也就是1,當我們運行兩個這樣的程式,那麼工作負載可能就會變成2,那麼CPU就需要在不同的任務之間切換啦!
[root@localhost ~]# uptime
 12:57:06 up  5:41,  3 users,  load average: 0.00, 0.01, 0.05  #好吧,現在幾乎沒有負載

[root@localhost ~]# batch 
at> /usr/bin/updatedb
at> <EOT>
job 12 at Mon Sep  4 12:51:00 2017

同樣batch同樣也可以使用atq和atrm來管理。

 

周期性任務crond

迴圈周期性的任務是由cron(crond)這個系統服務控制的,因為linux上原本就有很多的迴圈周期性的任務,例如系統會周期性的刪除/tmp目錄下的臨時文件。linux也給管理員和用戶提供了控制迴圈周期性任務的命令——crontab。

服務程式cronie提供了crond守護進程及相關的輔助工具:

[frank@localhost ~]$ rpm -q cronie
cronie-1.4.11-14.el7_2.1.x86_64
確保crond守護進程(daemon)處於運行狀態 在centos7中:
[root@localhost ~]# systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-08-10 07:16:37 EDT; 3 weeks 4 days ago
 Main PID: 682 (crond)
   CGroup: /system.slice/crond.service
           └─682 /usr/sbin/crond -n

Aug 10 07:16:37 localhost.localdomain systemd[1]: Started Command Scheduler.
Aug 10 07:16:37 localhost.localdomain systemd[1]: Starting Command Scheduler...
Aug 10 07:16:37 localhost.localdomain crond[682]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)
Aug 10 07:16:37 localhost.localdomain crond[682]: (CRON) INFO (running with inotify support)

在centos6中使用:

[root@localhost ~]# service crond status    #centos7也支持
在/etc/目錄下存在cron.deny,寫入其中的用戶不能夠使用crontab命令,有的時候不存在cron.deny而存在的是cron.allow,則只有在其中的用戶才能使用crontab命令。如果兩個文件都存在cron.allow的優先順序要比cron.deny的優先順序高。

 向crond提交作業的方式不同於at,它需要使用專用的配置文件,此文件有固定的格式,不建議使用文本編輯器直接編輯,要使用crontab。文本編輯器編輯保存退出時不會檢查語法錯誤,而使用crontab保存退出會檢查語法錯誤。

cron的任務分為兩類:

1.系統cron任務,主要用戶實現系統自身的維護,一般手動編輯/etc/crontab文件,如果修改後不能馬上執行,可以手動的重啟這個服務 systemctl restart crond;

2.用戶cron任務,一般使用crontab命令。

好的,我們現在來看一下系統cron的配置文件/etc/crondtab吧!

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 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
註意: (1)每一行定義一個周期性的任務,共七個欄位:      *  *  *  *  *:定義周期性的時間      user-name:運行任務的用戶身份      command to be executed:任務 (2)此處的環境變數不同於用戶登錄後獲得的環境,因此建議使用絕對路徑,或者之定義PATH路徑 (3)執行結果郵件發送給MAILTO指定的用戶。
周期時間表示法則:
(1)特定值
          給定時間點有效取值範圍內的值
          註意:day of week 和day of mouth一般不同時使用
(2)*
          給定時間點有效取值範圍內的所有值,表示每...
(3)離散取值
           在時間點上使用逗號分隔的多個值:#,#,#
(4)連續取值
           在時間點上使用逗號分隔的多個值:#-#
(5)在指定時間上,定義步長
           /#,#即步長
註意: (1)指定的時間點不能被步長真出時,其意義將不復存在; (2)最小時間單位為分鐘,想完成秒級人物,的需要額外藉助其他的機制。

示例:

(1) 3 * * * *:每小時執行一次;每小時的第3分鐘;
(2) 3 4 * * 5:每周執行一次;每周5的4點3分;
(3) 5 6 7 * *:每月執行一次;每月的7號的6點5分;
(4) 7 8 9 10 *:每年執行一次;每年的10月9號8點7分;
(5) 9 8 * * 3,7:每周三和周日的8點7分
(6) 0 8,20 * * 3,7:每周三和周日的20點和20點8分執行;
(7) 0 9-18 * * 1-5:每周一到周五的早上9點到18點
(8) */5 * * * *:每5分鐘執行一次某任務;
當給用戶創建一個周期性的任務的時候,會在/var/spool/cron生成一個與其用戶名相同的配置文件。 下麵就來講一下crontab命令:
語法:crontab  [OPTIONS]
OPTIONS:
    -e:編輯任務
    -l:列出所有任務
    -r:移除所有的任務,即刪除/var/spool/cron/USERNAME文件
    -i:在使用-r選項移除所有任務提示用戶
    -u user:root用戶可為指定用戶管理cron任務
下麵我們就來舉個例子吧! 比如每分鐘列印一個echo:
[frank@localhost ~]$ crontab -e
no crontab for frank - using an empty one

* * * * * echo "hello"

列出所有的任務:

[frank@localhost ~]$ crontab -l
* * * * * echo "hello"

移除所有的任務:

[frank@localhost ~]$ crontab -r
[frank@localhost ~]$ crontab -l
no crontab for frank

運行的結果以郵件通知給當前的用戶,如果拒絕接受郵件,可以使用輸出重定向:

 COMMAND > /dev/null

註意:定義COMMAND時,如果命令需要用到%,需要對其轉義,但放置於單引號中的%不用轉義。

crond服務讀取配置文件的位置:

一般來說,crond預設有三個地方會有執行的腳本配置,他們分別是:

/etc/crontab

/etc/cron.d/*

/var/spool/cron/*

前兩個是與系統運作有關係,最後一個主要用戶用自己。

下麵我們來看一下/etc/cron.d/目錄下的文件吧!

[root@localhost ~]# ll /etc/cron.d/
total 4
-rw-r--r--. 1 root root 128 Mar 31  2016 0hourly
[root@localhost ~]# cat /etc/cron.d/0hourly 
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly  #run-parts腳本會在大約5分鐘內隨機選擇一個時間去執行/etc/cron.hourly內的所有文件
[root@localhost ~]# cat /etc/cron    #細心的朋友會發現etc目錄下還有很多關於crond的文件
cron.d/       cron.daily/   cron.deny     cron.hourly/  cron.monthly/ crontab       cron.weekly/ 

思考:某任務在指定的時間因關機未能執行,下次開機會不會自動執行?

答案:不會!.

如果期望某時間因故未能按時執行,下次開機後無論是否到了相應時間點都要執行一次,可使用anacron實現, /etc/ 底下其實還有 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/,那三個目錄是代表每日、每周、每月各執行一次的意思,跟 /etc/cron.hourly/ 不太一樣的是,這三個目錄是由 anacron 所執行的,而 anacron 的執行方式則是放在/etc/cron.hourly/0anacron 裡面的。

 

最後的總結

  • 個人的行為推薦使用 crontab -e:如果你只是根據自己的個人需求來運行周期性的任務,而不想被其他的用戶看到,建議使用crontab -e,/etc/crontab文件是大家都能讀取的哦!
  • 系統維護管理推薦使用vim /etc/crontab:如果你的這個周期性的任務是系統幾倍的,而且非常的重要,為了讓方便管理和容易追蹤,建議直接寫入/etc/crontab;
  • 自己開發的軟體使用vim /etc/cron.d/newfile:如果你想要運行自己的開發的軟體,那麼最好的是使用全新的配置文件,並放置在/etc/cron.d目錄內即可。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Amazon在SIGMOD 2017發表了論文《Amazon Aurora: DesignConsiderations for High Throughput Cloud-Native Relational Databases》,第一次公開介紹了Aurora的設計理念和內部實現,下文是我對論文的解讀 ...
  • 作者: kent鵬 轉載請註明出處: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游標(游標)Cursor 在寫java程式中有集合的概念,那麼在pl/sql中也會用到多條記錄,這時候我們就要用到游標,游標可以存儲查詢返回的多條數據。 語法: ...
  • Nuget添加StackExchange.Redis的引用 由於Redis封裝類同時使用了Json,需要添加JSON.NET引用(Newtonsoft.Json) Redis封裝類 /// <summary> /// Redis 操作類 /// </summary> public class Red ...
  • 本文總結一下ORACLE資料庫中如何獲取SQL綁定變數值的方法,在SQL優化調優過程中,經常會用到這方面的知識點。在此梳理、總結一下,方面日後查找、翻閱。 方法1:查詢V$SQL V$SQL視圖中的BIND_DATA欄位用來存儲綁定變數的值,但是從這個視圖查詢綁定變數的值,有很大的局限性: 1: 它... ...
  • 之前一直都是使用的微軟Sql Server資料庫,現在在學習數據分析,要用到mysql。剛好公司在進行雲架構升級,資料庫選型為MariaDB,就順勢安裝體驗了一把MariaDB。這裡記錄一下學習過程。 1、下載 地址如下:https://downloads.mariadb.org/ 安裝如下學習版本 ...
  • orcal資料庫使用mybatis接收參數,如果傳的是多個參數,需要使用#{0},#{1},。。。等代替具體參數名,0 代表第一個參數,1 代表第二個參數,以此類推。 錯誤語句: 正確語句: ...
  • 在mapper.xml中 , 如果單參數是String類型 , 且在sql語句中對參數進行了判斷 , 如下 when 中的判斷 , 如果出現 if 判斷也是一樣的。都需要把判斷中的參數用 _parameter 來代替 ,。 另外orcal中判斷欄位是否為空需要使用 is null , 同理,判斷不為 ...
  • SSIS 其全稱是Sql Server Integration Services ,是Microsoft BI 解決方案的一大利器. SSIS 的體繫結構主要由四部分組成:Integration Services 服務、Integration Services 對象模型、Integration Se ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...