雷諾與法國富豪攜手 搶進電動車市場

法國雷諾集團(Renault SA)與法國富豪波洛黑(Vincent Bollore)決定合作,共同製造電動車,瞄準零排放汽車日益強勁的需求,及正於各地興起的環保汽車租用潮流。   雷諾汽車將於 2015 下半年開始生產波洛黑的電動車款「藍車(Bluecar)」,但並未透露生產目標。該車款自 2011 年起,被使用於巴黎名為「Autolib」的電動車租賃共享計畫中,此計畫同時也於里昂及波爾多等地運行。   此外,雷諾汽車與波洛黑亦宣布,將成立一策略聯盟,其中波洛黑擁有 70% 股權,雷諾股權則達 30%。該聯盟將於法國及歐洲其他地方提供車輛共享服務。另外並進行研究,以協助雷諾製造一款 3 人座、使用波洛黑所生產電池的電動車。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

使用Kubernetes、K3s和Traefik2進行本地開發

作者簡介

Vyacheslav,擁有運維和項目管理經驗的軟件工程師

這篇文章將承接我此前搭建的本地Docker開發環境,具體步驟已經放在在以下網址:

https://github.com/Voronenko/traefik2-compose-template

除了經典的docker化的項目之外,我還有其他的Kubernetes項目。儘管Kubernetes已經成為容器編排的事實標準,但是不得不承認Kubernetes是一個既消耗資源又消耗金錢的平台。由於我並不經常需要外部集群,因此我使用輕量級K3s發行版來進行Kubernetes本地開發。

K3s是為IoT和邊緣計算而構建的經過認證的Kubernetes發行版之一,還能夠按產品規模部署到VM。

我使用K3s的方式是這樣的:在我的工作筆記本上本地安裝K3s,儘管有時我需要在本地部署較重的測試工作負載,為此,我準備了兩個神器——兩個運行ESXi的外部Intel NUCs。

默認情況下,K3s安裝Traefik 1.x作為ingress,如果你對此十分滿意,那麼無需往下繼續閱讀了。

在我的場景中,我同時會牽涉到好幾個項目,特別是經典的docker和docker swarm,因此我經常遇到在獨立模式下部署Traefik的情況。

因此,本文其餘部分將深入介紹如何將外部traefik2配置為K3s集群的ingress。

安裝Kubernetes K3s系列集群

你可以按照常規方式使用命令curl -sfL https://get.k3s.io | sh -安裝K3s,或者你可以使用輕量實用程序k3sup安裝(https://github.com/alexellis/k3sup)。具體步驟在之前的文章介紹過。

與我們的設置不同的是,我們使用命令--no-deploy traefik專門安裝了不帶traefik組件的K3s。

export CLUSTER_MASTER=192.168.3.100
export CLUSTER_DEPLOY_USER=slavko
k3sup install --ip $CLUSTER_MASTER --user $CLUSTER_DEPLOY_USER --k3s-extra-args '--no-deploy traefik'

執行后,你將獲得使用kubectl所需的連接詳細信息。安裝K3s后,你可以快速檢查是否可以看到節點。

# Test your cluster with - export path to k3s cluster kubeconfig:
export KUBECONFIG=/home/slavko/kubeconfig
kubectl get node -o wide

注:這裏沒有固定的安裝模式,你甚至可以使用docker-compose自行啟動它。

server:
  image: rancher/k3s:v0.8.0
  command: server --disable-agent --no-deploy traefik
  environment:
    - K3S_CLUSTER_SECRET=somethingtotallyrandom
    - K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml
    - K3S_KUBECONFIG_MODE=666
  volumes:
    # k3s will generate a kubeconfig.yaml in this directory. This volume is mounted
    # on your host, so you can then 'export KUBECONFIG=/somewhere/on/your/host/out/kubeconfig.yaml',
    # in order for your kubectl commands to work.
    - /somewhere/on/your/host/out:/output
    # This directory is where you put all the (yaml) configuration files of
    # the Kubernetes resources.
    - /somewhere/on/your/host/in:/var/lib/rancher/k3s/server/manifests
  ports:
    - 6443:6443

node:
  image: rancher/k3s:v0.8.0
  privileged: true
  links:
    - server
  environment:
    - K3S_URL=https://server:6443
    - K3S_CLUSTER_SECRET=somethingtotallyrandom
  volumes:
    # this is where you would place a alternative traefik image (saved as a .tar file with
    # 'docker save'), if you want to use it, instead of the traefik:v2.0 image.
    - /sowewhere/on/your/host/custom-image:/var/lib/rancher/k3s/agent/images

配置Traefik 2,與Kubernetes一起使用

在文章開頭提到的鏈接中,我已經在我的系統中安裝了Traefik 2,並根據該鏈接內容,服務於一些需求。現在是時候配置Traefik 2 Kubernetes後端了。

Traefik 2使用CRD(自定義資源定義)來完成這一點。定義的最新示例可以在以下鏈接中找到,但這些示例僅適用於Traefik 2也作為Kubernetes工作負載的一部分執行的情況:

https://docs.traefik.io/reference/dynamic-configuration/kubernetes-crd/

對於外部Traefik 2,我們僅需要以下描述的定義子集。

我們引入一系列自定義資源定義,以允許我們來描述我們的Kubernetes服務將會如何暴露到外部,traefik-crd.yaml

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingressroutes.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: IngressRoute
    plural: ingressroutes
    singular: ingressroute
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingressroutetcps.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: IngressRouteTCP
    plural: ingressroutetcps
    singular: ingressroutetcp
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: middlewares.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Middleware
    plural: middlewares
    singular: middleware
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: tlsoptions.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TLSOption
    plural: tlsoptions
    singular: tlsoption
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: traefikservices.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TraefikService
    plural: traefikservices
    singular: traefikservice
  scope: Namespaced  

同時,我們需要集群角色traefik-ingress-controller,以提供對服務、端點和secret的只讀訪問權限以及自定義的traefik.containo.us組,traefik-clusterrole.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller

rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses/status
    verbs:
      - update
  - apiGroups:
      - traefik.containo.us
    resources:
      - middlewares
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - ingressroutes
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - ingressroutetcps
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - tlsoptions
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - traefikservices
    verbs:
      - get
      - list
      - watch

最後,我們需要系統服務賬號traefik-ingress-controller與之前創建的集群角色traefik-ingress-controller相關聯。

---
kind: ServiceAccount
apiVersion: v1
metadata:
  namespace: kube-system
  name: traefik-ingress-controller

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller

roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
  - kind: ServiceAccount
    name: traefik-ingress-controller
    namespace: kube-system

我們應用以上資源之後:

apply:
  kubectl apply -f traefik-crd.yaml
  kubectl apply -f traefik-clusterrole.yaml
  kubectl apply -f traefik-service-account.yaml

我們已經準備好開始調整Traefik 2

將Traefik 2指向K3s集群

根據Traefik文檔的建議,當Traefik部署到Kubernetes中時,它將讀取環境變量KUBERNETES_SERVICE_HOST和KUBERNETES_SERVICE_PORT或KUBECONFIG來構造端點。

/var/run/secrets/kubernetes.io/serviceaccount/token中查找訪問token,而SSL CA證書將在/var/run/secrets/kubernetes.io/serviceaccount/ca.crt.中查找。當部署到Kubernetes內部時,兩者都會自動提供掛載。

當無法找到環境變量時,Traefik會嘗試使用external-cluster客戶端連接到Kubernetes API server。這一情況下,需要設置endpoint。具體來說,可以將其設置為kubectl代理使用的URL,以使用相關的kubeconfig授予的身份驗證和授權連接到Kubernetes集群。

Traefik 2可以使用任何受支持的配置類型來靜態配置-toml、yaml或命令行交換。

[providers.kubernetesCRD]
  endpoint = "http://localhost:8080"
  token = "mytoken"
providers:
  kubernetesCRD:
    endpoint = "http://localhost:8080"
    token = "mytoken"
    # ...
--providers.kubernetescrd.endpoint=http://localhost:8080 
--providers.kubernetescrd.token=mytoken

第一次運行時,如果你在外部有Traefik,很有可能沒有traefik-ingress-controller訪問token來指定mytoken。那麼,你需要執行以下命令:

# Check all possible clusters, as your .KUBECONFIG may have multiple contexts:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

# Output kind of
# Alias tip: k config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
# Cluster name  Server
# default  https://127.0.0.1:6443

# You are interested in: "default", if you did not name it differently

# Select name of cluster you want to interact with from above output:
export CLUSTER_NAME="default"

# Point to the API server referring the cluster name
export APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")
# usually https://127.0.0.1:6443

# Gets the token value
export TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='traefik-ingress-controller')].data.token}" --namespace kube-system|base64 --decode)

# Explore the API with TOKEN

如果成功了,你應該收到以下響應:

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "192.168.3.100:6443"
    }
  ]

以及一些事實,如token:

eyJhbGciOiJSUzI1NiIsImtpZCI6IjBUeTQyNm5nakVWbW5PaTRRbDhucGlPeWhlTHhxTXZjUDJsRmNacURjVnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlci10b2tlbi12emM3diIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImQ5NTc3ZTkxLTdlNjQtNGMwNi1iZDgyLWNkZTk0OWM4MTI1MSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTp0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlciJ9.Mk8EBS4soO8uX-uSnV3o4qZKR6Iw6bgeSmPhHbJ2fjuqFgLnLh4ggxa-N9AqmCsEWiYjSi5oKAu986UEC-_kGQh3xaCYsUwlkM8147fsnwCbomSeGIct14JztVL9F8JwoDH6T0BOEjn-J9uY8-fUKYL_Y7uTrilhFapuILPsj_bFfgIeOOapRD0XshKBQV9Qzg8URxyQyfzl68ilm1Q13h3jLj8CFE2RlgEUFk8TqYH4T4fhfpvV-gNdmKJGODsJDI1hOuWUtBaH_ce9w6woC9K88O3FLKVi7fbvlDFrFoJ2iVZbrRALPjoFN92VA7a6R3pXUbKebTI3aUJiXyfXRQ

根據上次響應的API server的外部地址:https://192.168.3.100:6443

同樣,提供的token中沒有任何特殊之處:這是JWT的token,你可以使用https://jwt.io/#debugger-io,檢查它的內容。

{
  "alg": "RS256",
  "kid": "0Ty426ngjEVmnOi4Ql8npiOyheLxqMvcP2lFcZqDcVs"
}
{
  "iss": "kubernetes/serviceaccount",
  "kubernetes.io/serviceaccount/namespace": "kube-system",
  "kubernetes.io/serviceaccount/secret.name": "traefik-ingress-controller-token-vzc7v",
  "kubernetes.io/serviceaccount/service-account.name": "traefik-ingress-controller",
  "kubernetes.io/serviceaccount/service-account.uid": "d9577e91-7e64-4c06-bd82-cde949c81251",
  "sub": "system:serviceaccount:kube-system:traefik-ingress-controller"
}

正確的配置非常重要,因此請確保對APISERVER的兩個調用均返回合理的響應。

export APISERVER=YOURAPISERVER
export TOKEN=YOURTOKEN

curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

curl -X GET $APISERVER/api/v1/endpoints --header "Authorization: Bearer $TOKEN" --insecure

創建其他訪問token

控制器循環確保每個服務賬戶都有一個帶有API token的secret,可以像我們之前那樣被發現。

此外,你還可以為一個服務賬戶創建額外的token,創建一個ServiceAccountToken類型的secret,併為服務賬戶添加一個註釋,控制器會用生成的token來更新它。

---
apiVersion: v1
kind: Secret
namespace: kube-system
metadata:
  name: traefik-manual-token
  annotations:
    kubernetes.io/service-account.name: traefik-ingress-controller
type: kubernetes.io/service-account-token

# Any tokens for non-existent service accounts will be cleaned up by the token controller.

# kubectl describe secrets/traefik-manual-token

用以下命令創建:

kubectl create -f ./traefik-service-account-secret.yaml
kubectl describe secret traefik-manual-token

刪除/無效:

kubectl delete secret traefik-manual-token

對外部traefik 2的更改構成定義

我們需要在文章開頭給出的鏈接中獲得的traefik2配置進行哪些更改?

https://github.com/Voronenko/traefik2-compose-template

a) 我們在新文件夾kubernetes_data中存儲ca.crt文件,該文件用於驗證對Kubernetes授權的調用。這是可以在kubeconfig文件的clusters-> cluster-> certificate-authority-data下找到的證書。

該volume將映射在/var/run/secrets/kubernetes.io/serviceaccount下以獲取官方Traefik 2鏡像

volumes:
    ...
      - ./kubernetes_data:/var/run/secrets/kubernetes.io/serviceaccount

b) 調整Traefik 2 kubernetescrd後端以提供3個參數:endpoint、證書路徑和token。請注意,作為外部Traefik作為docker容器,你需要指定正確的endpoint地址,並確保以安全的方式進行。

  - "--providers.kubernetescrd=true"
      - "--providers.kubernetescrd.endpoint=https://192.168.3.100:6443"
      - "--providers.kubernetescrd.certauthfilepath=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
      - "--providers.kubernetescrd.token=YOURTOKENWITHOUTANYQUOTES

如果你都執行正確了,那麼你現在應該在Traefik UI上看到了一些希望。如果你沒有看到traefik,或者在運行Traefik時有問題,你可以查看之後的故障排除部分。

現在是時候通過Trafik 2暴露一些Kubernetes服務了,以確保Traefik 2能夠作為ingress工作。讓我們來看經典案例whoami服務,whoami-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: whoami

spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: whoami

---
kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: default
  name: whoami
  labels:
    app: whoami

spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: containous/whoami
          ports:
            - name: web
              containerPort: 80

並且以http或https的方式暴露它,whoami.k.voronenko.net全限定域名下的whoami-ingress-route.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute-notls
  namespace: default
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`whoami.k.voronenko.net`)
      kind: Rule
      services:
        - name: whoami
          port: 80

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute-tls
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`whoami.k.voronenko.net`)
      kind: Rule
      services:
        - name: whoami
          port: 80
  tls:
    certResolver: default

然後應用它:

kubectl apply -f whoami-service.yaml
  kubectl apply -f whoami-ingress-route.yaml

應用后,你應該會在Traefik dashboard上看到一些希望,即KubernetesCRD後端。

正如你所看到的,Traefik已經檢測到我們的K3s Kubernetes集群上運行的新工作負載,而且它與我們在同一個盒子上的經典Docker工作負載(如portainer)很好地共存。

讓我們檢查一下Traefik 2是否將Traefik路由到了我們的Kubernetes工作負載:如你所見,你可以在http和https endpoint上成功地接觸到whoami工作負載,瀏覽器接受你的證書為可信任的“綠標籤”。

我們的目標達到了!我們在本地筆記本上配置了Traefik 2。Traefik 2將你的docker或Kubernetes工作流暴露在http或https endpoint上。帶可選的 letsencrypt 的 Traefik 2 將負責 https。

故障排查

正如你所知,在配置過程可能存在多個問題,你可以考慮使用一些分析工具,如:

https://github.com/Voronenko/dotfiles/blob/master/Makefile#L185

我特別建議:

a) VMWare octant:這是一個基於Web的功能強大的Kubernetes dashboard,你可以在上面使用你的kubeconfig

b) Rakess:這是一個獨立工具也是一個kubectl插件,用於显示Kubernetes服務器資源的訪問矩陣(https://github.com/corneliusweig/rakkess)

檢查系統賬戶的憑據

rakkess --sa kube-system:traefik-ingress-controller

c) kubectl

檢查哪些角色與服務賬戶相關聯

kubectl get clusterrolebindings -o json | jq -r '
  .items[] |
  select(
    .subjects // [] | .[] |
    [.kind,.namespace,.name] == ["ServiceAccount","kube-system","traefik-ingress-controller"]
  ) |
  .metadata.name'

d) Traefik 文檔:例如kubernetescrd後端提供了更多配置開關的方式。

--providers.kubernetescrd  (Default: "false")
        Enable Kubernetes backend with default settings.
    --providers.kubernetescrd.certauthfilepath  (Default: "")
        Kubernetes certificate authority file path (not needed for in-cluster client).
    --providers.kubernetescrd.disablepasshostheaders  (Default: "false")
        Kubernetes disable PassHost Headers.
    --providers.kubernetescrd.endpoint  (Default: "")
        Kubernetes server endpoint (required for external cluster client).
    --providers.kubernetescrd.ingressclass  (Default: "")
        Value of kubernetes.io/ingress.class annotation to watch for.
    --providers.kubernetescrd.labelselector  (Default: "")
        Kubernetes label selector to use.
    --providers.kubernetescrd.namespaces  (Default: "")
        Kubernetes namespaces.
    --providers.kubernetescrd.throttleduration  (Default: "0")
        Ingress refresh throttle duration
    --providers.kubernetescrd.token  (Default: "")
        Kubernetes bearer token (not needed for in-cluster client).
    --providers.kubernetesingress  (Default: "false")
        Enable Kubernetes backend with default settings.
    --providers.kubernetesingress.certauthfilepath  (Default: "")
        Kubernetes certificate authority file path (not needed for in-cluster client).
    --providers.kubernetesingress.disablepasshostheaders  (Default: "false")
        Kubernetes disable PassHost Headers.
    --providers.kubernetesingress.endpoint  (Default: "")
        Kubernetes server endpoint (required for external cluster client).
    --providers.kubernetesingress.ingressclass  (Default: "")
        Value of kubernetes.io/ingress.class annotation to watch for.
    --providers.kubernetesingress.ingressendpoint.hostname  (Default: "")
        Hostname used for Kubernetes Ingress endpoints.
    --providers.kubernetesingress.ingressendpoint.ip  (Default: "")
        IP used for Kubernetes Ingress endpoints.
    --providers.kubernetesingress.ingressendpoint.publishedservice  (Default: "")
        Published Kubernetes Service to copy status from.
    --providers.kubernetesingress.labelselector  (Default: "")
        Kubernetes Ingress label selector to use.
    --providers.kubernetesingress.namespaces  (Default: "")
        Kubernetes namespaces.
    --providers.kubernetesingress.throttleduration  (Default: "0")
        Ingress refresh throttle duration
    --providers.kubernetesingress.token  (Default: "")
        Kubernetes bearer token (not needed for in-cluster client).

e) 確保Traefik有足夠的權限可以訪問apiserver endpoint

如果你希望Traefik為你查詢信息:通過在配置中放置一些錯誤的apiserver地址,可以查看訪問的endpoint和查詢順序。有了這些知識和你的Traefik Kubernetes token,你就可以使用Traefik憑證檢查這些endpoint是否可以訪問。

traefik_1    | E0421 12:30:12.624877       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1.Endpoints: Get https://192.168.3.101:6443/api/v1/endpoints?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625341       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1.Service: Get https://192.168.3.101:6443/api/v1/services?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625395       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1beta1.Ingress: Get https://192.168.3.101:6443/apis/extensions/v1beta1/ingresses?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625449       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.Middleware: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/middlewares?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625492       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.IngressRoute: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/ingressroutes?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625531       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.TraefikService: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/traefikservices?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625572       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.TLSOption: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/tlsoptions?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625610       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.IngressRouteTCP: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/ingressroutetcps?limit=500&resourceVersion=0:

f) 記錄K3s本身

安裝腳本將自動檢測你的操作系統是使用systemd還是openrc並啟動服務。使用openrc運行時,將在/var/log/k3s.log中創建日誌。使用systemd運行時,將在/var/log/syslog中創建日誌,並使用journalctl -u k3s查看。

在那裡,你可能會得到一些提示,例如:

кві 21 15:42:44 u18d k3s[612]: E0421 15:42:44.936960     612 authentication.go:104] Unable to authenticate the request due to an error: invalid bearer token

這將為你提供有關K8s Traefik起初使用時出現問題的線索,Enjoy your journey!

相關代碼你可以在以下鏈接中找到:

https://github.com/Voronenko/k3s-mini

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

厄瓜多總統與原住民領袖達協議 化解反撙節示威

摘錄自2019年10月14日中央社報導

莫雷諾為向國際貨幣基金貸款42億美元而取消燃油補貼後,國內物價迅速飆升,引發長達12天的示威,造成7人喪命。暴力衝突迫使莫雷諾將政府遷移至厄瓜多第2大城瓜亞基爾(Guayaquil),並嚴重影響石油業,能源部暫停超過2/3原油的配送。抗議人士甚至佔領亞馬遜雨林地區的3處石油設施。

厄瓜多總統莫雷諾及原住民領袖瓦爾加斯13日達成協議,終結近2週來反對撙節措施的暴力抗議。政府是為為獲得國際貨幣基金(IMF)數十億美元貸款,而採取這些緊縮措施。

法新社報導,聯合國官員代表宣讀的聯合聲明說,「根據這項協議,厄瓜多各地的群眾動員劃下句點,我們承諾會恢復國內和平」。聲明並表示,政府已撤回取消燃油補貼的命令。臉上塗著油彩、頭上頂著羽毛頭飾的瓦爾加斯證實:「這些適用於我們全國各地的措施已經取消了。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

大陸代工給鴻海?特斯拉駁斥傳言

美國電動車廠特斯拉交貨能力大幅提升,出現逾 7 成的成長,面對會否將代工業務拉回大陸時,特斯拉卻傾向冷處理,甚至還主動發出官方回應,強調「目前沒有在大陸代工生產的計畫」,看來先前外界傳出鴻海要在中國替 Tesla 代工電動車的合作計畫,恐怕還要再等一等。   特斯拉 2013 年共交付 2 萬輛 Model S,2014 年有機會上看 3.5 萬輛,市場將特斯拉交貨能力大增原因指向生產線的擴展,特斯拉美國生產基地最近又新增了一條生產線,周產能達 1,000 輛。   除了在美擴充生產線,會否將代工產線拉回大陸,也成了市場關注焦點,但對此,特斯拉卻傾向冷處理,還特別發出官方回應,強調「特斯拉現所有在華銷售的車輛都是在美國生產,再進口到中國,目前沒有在大陸代工生產的計畫。」  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

重歐美輕亞洲 特斯拉第200個充電站投入使用

近日,特斯拉宣佈其第200個超級充電站已開放使用。這個超級充電站位於美國加州南部的奧克斯納德河流公園公務中心附近。特斯拉目前有57%的充電站位於美國。這些超級充電站可讓特斯拉電動汽車30分鐘充滿電。   特斯拉正不斷完善其充電網路,其向南有霍索恩(Hawthorne)和特甬牧場(Tejon Ranch)超級充電站,向北有索爾萬(Solvang)超級充電站,東部則有巴斯托(Barstow)超級充電站。他們表示明年其充電站網路將覆蓋美國98%的區域。   目前特斯拉已分別在北美、歐洲和亞洲建造了114座、66座、20座超級充電站。為了完善充電網路,特斯拉未來將在北美進一步縮小超級充電站間的間隙,並且將其將延伸至加拿大,而在歐洲,特斯拉將增大超級充電站密度和覆蓋國家。但是在亞洲,特斯拉的超級充電站建造計畫則顯得相對保守,如今在中國僅有7座。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

談談 Promise 以及實現 Fetch 的思路

Promise 是異步編程的一種解決方案。

Promise


/**
 * 屬性
 */
Promise.length
Promise.prototype

/**
 * 方法
 */
Promise.all(iterable)   // 所有成功觸發成功  任何失敗觸發失敗
Promise.race(iterable)  // 任意一個成功或失敗后觸發
Promise.reject(reason)
Promise.resolve(value)

/**
 * 原型
 */
Promise.prototype.constructor
//方法
Promise.prototype.catch(onRejected)
Promise.prototype.then(onFulfilled, onRejected)
Promise.prototype.finally(onFinally)

Promise 有三種狀態

  • pending: 初始狀態,既不是成功,也不是失敗狀態。
  • resolve: 意味着操作成功完成。(resoloved)
  • reject: 意味着操作失敗。

pending

pending 是初始狀態,執行 resolve/reject 會進入對應狀態,如果不執行,責一直為 pending 狀態

例如下面代碼,promise 將一直在 pending 狀態,不會執行 then/catch.

new Promise(function (resolve, reject) { })
  .then(res => console.log(res))
  .catch(err => console.log(err))

resolve

resolve 意味着操作成功完成, 如果有 .then,值會傳入 .then 的第一個參數函數里。

new Promise(function (resolve, reject) {
  resolve(1)
})
  .then(res => console.log(res))

then 的第一個參數是成功的回調,第一個參數的返回值會影響接下來鏈的去向。第一個參數的返回值一般有三種情況

  • 無返回值:會去執行下一個 .then ,沒有參數
  • 返回值非promise:調用下一個then的函數,參數為返回值
  • 返回值為promise:根據promise的執行結果,執行 下一個then/catch,如果一直是pending,則不執行下一個then/catch

例如想要在當前 then 終止,可以這樣操作:

  .then((res) => new Promise(() => {}))

reject

reject 意味着操作失敗。

使用 .catch 會捕獲到錯誤信息。

與代碼報錯(如 undefined.a)不同的是, 代碼報錯如果不使用 catch 捕獲,會向外傳遞,最終傳遞到根結點;而 reject 屬於 promise 錯誤,即使不使用 catch 捕獲也不會對全局有影響。

用 promise 實現 fetch

先來看幾個問題:

  1. 如果請求 code 404, 會走 then 還是 catch? (答案:then)
  2. 控制台能看到一行 404 的錯誤, 為什麼還是走 then 不是 catch 呢
  3. 如果請求跨域失敗,走 then 還是 catch?(答案:catch)
  4. 同樣是控制台看到錯誤,兩者有什麼區別呢?
  5. 跨域失敗的報錯, 和 then 中 undefined.a 報錯,如果都不 catch,後者在 react 腳手架開發環境頁面會蹦,兩者有什麼區別?

帶着這幾個問題,來看看 fetch。

fetch 返回值是 promise,所以有三種狀態 pending、resolve、reject.

  • pending: 請求中
  • resolve: 請求成功(code 200/404/500 等, 非 200 控制台輸出錯誤)
  • reject: 請求失敗(跨域失敗、連接超時、無網絡等,控制台輸出錯誤)

我們還發現,請求失敗時,只能 catch 到最後一行錯誤, 如圖

捕獲后

為什麼 404 在控制台看到錯誤,還走 then, resolve 如何實現

實現有幾個難點,

  1. throw 後面代碼不會執行;
  2. 先報錯,后執行 then;
  3. catch 后錯誤不會打印在控制台;

試了下,Promise.reject(‘xxx’) 這樣的報錯方式雖然是微觀任務,但是總是在.then之後才在控制台輸出,更像是宏觀任務。所以也加個setTImeout宏觀任務調至後面。

var fetch = function () {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      if ('請求成功 200') {
        resolve('Response數據結構');
      } else if ('請求成功 404,500等') {
        Promise.reject('GET xxxxxxxx 404');
        setTimeout(function () {
          resolve('Response數據結構');
        });
      }
    })
  })
}

請求失敗 例如跨域失敗 reject 如何實現呢

同樣加個 setTimeout

var fetch = function () {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      if ('請求成功 200') {
        resolve('Response數據結構');
      } else if ('請求成功 404,500等') {
        Promise.reject('GET xxxxxxxx 404');
        setTimeout(function () {
          resolve('Response數據結構');
        });
      } else if ('請求失敗') {
        Promise.reject('Access to fetch xxxxx with CORS disabled.');
        Promise.reject('GET xxxxx net::ERR_FAILED');
        setTimeout(function () {
          reject('TypeError: Failed to fetch');
        });
      }
    })
  })
}

還是有些問題,我們實現的因為在promise 中,錯誤會有前綴 Uncaught (in promise)。瀏覽器客戶端應該有更好的實現方式。

最後總結一下 fetch 的三種情況

  • pending: 請求中
  • resolve: 請求成功(code 200: 調用 resolve 返回數據; code: 404/500 等, 先拋錯,再調用 resolve 返回數據。)
  • reject: 請求失敗(跨域失敗、連接超時、無網絡等,先控制台拋錯,再調用 reject)

拋錯均不影響代碼執行,與 undefined.a 不同。

whosmeya.com

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

Linux-權限詳解

目錄

  • 前言
  • alias / unalias 命令別名
  • cd 切換目錄
  • cp 複製文件或目錄
  • cat 查看文件內容
  • chage 設置密碼有效期
  • chown 更改文件所屬
  • chmod 設置文件rwx權限
  • chattr / lsattr 隱藏屬性
  • crontab 定時任務
  • df 磁盤使用情況
  • date 系統時間 / hwclock 硬件時鐘
  • diff 文件比較
  • echo 標準輸出
  • find / locate 文件搜索
  • free 查看內存使用
  • head 查看文件前面的內容
  • history 命令歷史
  • ip 網絡配置管理
  • kill 結束進程
  • ln 創建鏈接(快捷方式)
  • ls 查看目錄中的內容
  • less 分頁查看文件
  • mv 剪切 / 重命名 文件或目錄
  • mkdir 創建目錄
  • ps 查看進程
  • pwd 显示當前目錄
  • passwd 修改密碼
  • rm 刪除文件或目錄
  • su 切換用戶
  • stat 查看文件詳細信息
  • sort 排序 / uniq 去重
  • split 分割文件
  • tar 打包
  • top 動態查看進程
  • tail 查看文件末尾內容
  • touch 修改文件的時間屬性或創建空文件
  • useradd / groupadd 用戶和組管理
  • vi / vim 文本編輯器
  • wc 統計字數行數
  • xargs 參數傳遞
  • yum 紅帽系列包管理工具
  • zip / unzip 壓縮與解壓

前言

  • 以下命令測試環境為CentOS7.8
  • 使用的shell為系統默認的bash
  • Linux下是區分大小寫的,這點和Windows不同
  • Linux大部分命令語法為命令 [選項] [參數],我所介紹的選項為常用選項並不包含全部

alias / unalias 命令別名

alias命令用於給指令設置一個別名,unalias命令用於取消設置

  • 可以給長命令起一個簡單的別名便於使用,如:

    alias ens33="vi /etc/sysconfig/network-scripts/ifcfg-ens33"
    
  • 取消已設置的別名命令

    unalias ens33
    
  • 可以避免危險操作,如系統默認的命令rm mv cp等,都是通過alias加了-i參數的

    # 查看所有的使用別名的命令
    [root@God ~]# alias  
    alias cp='cp -i'
    alias l.='ls -d .* --color=auto'
    alias ll='ls -l --color=auto'
    alias ls='ls --color=auto'
    alias mv='mv -i'
    alias rm='rm -i'
    
  • 在命令前加\或者使用命令全路徑可忽略使用別名

    # 不進行詢問直接刪除mail.log文件
    \rm /var/log/mail.log  
    或
    /usr/bin/rm  /var/log/mail.log
    
  • 在命令行通過aliasunalias設置或取消的別名都是暫時性的,僅作用於當前登錄的會話。如果想要永久生效,可以在~/.bashrc文件添加別名設置

cd 切換目錄

cd命令用於切換工作目錄至指定的目錄,可用相對路徑和絕對路徑

  • 選項

    • / 表示根目錄
    • . 表示當前目錄
    • .. 表示上一級目錄
    • - 表示上次所在的目錄
    • ~ 表示當前用戶的家目錄
    # 進入用戶家目錄
    cd ~
    
    # 進入指定目錄
    cd /etc
    
    # 進入上兩級目錄
    cd ../..
    

cp 複製文件或目錄

cp用來複制文件或目錄到指定位置

  • 語法

    cp [選項] 源 目標
    
  • 選項

    • -a 相當於同時指定-dpr
    • -d 複製時保留鏈接(相當於Windows系統中的快捷方式)
    • -p 保留源文件或目錄的屬性
    • -r|R 對目錄進行遞歸處理,複製目錄時必須加上它才能複製
    • -f 覆蓋已存在的目標而不給出提示
    • -i-f相反,如果目標文件存在,則提示是否覆蓋
    # 複製文件/etc/hosts到目錄/local下
    cp /etc/hosts /local
    
    # 複製文件/etc/hosts到目錄/local下並命名為hosts.bak
    cp /etc/hosts /local/hosts.bak
    
    # 複製目錄/etc到目錄/local下,如果/local/etc已存在直接覆蓋
    cp -af /etc /local
    
    # 複製目錄/etc到目錄/local下並重命名為etc.bak
    cp -a /etc /local/etc.bak
    

cat 查看文件內容

cat命令適合查看少量內容,並可將多個文件連接到一起進行標準輸出,當文本數據內容量過大時,推薦使用lessmore進行查看

  • 語法

    cat [選項] 文件1 [文件2 文件N]
    
  • 選項

    • -n 輸出時显示行號
    • -s 當遇到有連續兩行以上的空白行,就替換成一個空白行
    # 查看resolv.conf的內容
    cat /etc/resolv.conf
    
    # 將/etc/resolv.conf和/etc/hosts兩個文件連接到一起進行標準輸出,並显示行號
    cat -n /etc/resolv.conf  /etc/hosts
    
  • cat還可以配合重定向將標準輸入寫到文件中

    [root@God ~]# cat > demo.txt << EOF
    > 我在命令行打上 cat > demo.txt << EOF
    > 在 > 後面寫的東西都能寫入到文件中
    > 寫完了所有內容后,在最後單獨寫個EOF就可以了
    > EOF
    [root@God ~]# cat -n demo.txt 
         1	我在命令行打上 cat > demo.txt << EOF
         2	在 > 後面寫的東西都能寫入到文件中
         3	寫完了所有內容后,在最後單獨寫個EOF就可以了
    

chage 設置密碼有效期

chage 命令本質是修改通過/etc/shadow文件中的內容來設置賬號密碼有效期限的

  • 語法

    chage [選項] 用戶
    
  • 選項

    • -l 列出用戶的當前設置
    • -d DATE DATE為日期,格式YYYY-MM-DD,即設置上次修改密碼的時間,設置為0則下次登錄時必須改密碼,設置為-1則密碼永不過期,密碼是否過期就是根據這個時間計算的
    • -E DATE DATE為日期,格式YYYY-MM-DD,設置賬號失效日期(對root慎用),設置為0則立即失效,設置為-1則永不失效
    • -M N N為天數,密碼有效期,即每過N天不修改密碼的話密碼就會過期
    • -m N N為天數,即距離上次修改日期N天後,才可以更改密碼,設置為0表示隨時可更改
    • -W N N為天數,即距離密碼過期日N天前開始發出警告信息
    • -I N N為天數,即如果一個密碼已過期N天,那麼該賬號將失效
    # 列出 jet 用戶的賬號密碼有效日期詳細信息
    chage -l jet
    
    # 使 jet 用戶下次登陸時必須修改密碼
    chage -d 0 jet
    
    # 設置 jet 用戶2020年8月8日賬號失效
    chage -E '2020-8-8' jet
    
    # 設置用戶至少每90天就需要改一次密碼,並在15天之前提醒
    chage -M 90 -W 15 jet
    

chown 更改文件所屬

chown命令可以更改Linux下文件或目錄的所屬用戶、所屬組,Linux下一切皆文件,而文件必須有所屬

  • 語法

    chown [用戶][:用戶組] 文件或目錄              
    
  • 選項

    • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
    • -v 显示執行過程
    # 更改/local/myfile.txt的擁有者為root用戶
    chown root /local/myfile.txt
    
    # 更改/local/myfile.txt的群組的使用者為root組
    chown :root /local/myfile.txt
    
    # 更改/local/myfile.txt的擁有者為root用戶,群組的使用者為root組
    chown root:root /local/myfile.txt
    
    # 更改目錄/local的擁有者為root用戶
    chown -R root /local
    

chmod 設置文件rwx權限

chmod命令可用於更改文件的r讀、w寫、x執行權限, 通過ls -lstat命令可查看文件的權限-rw-r--r-- 第一位表示文件類型,后9位每三位為一組,分別表示所屬用戶、所屬組、其他用戶的權限。

  • 語法

    chmod [選項] rwx的權限分值 文件或目錄
    
    • 權限分值 r=4, w=2, x=1
    chmod [選項] 身份標識(+|-)(r|w|x) 文件或目錄
    
    • 身份標識 u=user所屬用戶 , g=group所屬組, o=other其他用戶, a=all(u+g+o)所有用戶
  • 選項

    • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
    # 更改文件/local/myscript.sh的權限
    # 文件擁有者權限=7(r+w+x) 同組用戶權限=5(r+x) 其他用戶權限=5(r+x)
    chmod 755 /local/myscript.sh
    
    # 去掉其他用戶對文件/local/myscript.sh的寫權限
    chmod o-w /local/myscript.sh
    
    # 去掉其他用戶對文件/local/myscript.sh的寫權限,給同組用戶加上執行權限
    chmod o-w,g+x /local/myscript.sh
    
    # 更改目錄/local的權限
    chmod -R 754 /local
    

chattr / lsattr 隱藏屬性

chattr命令可以用來修改文件或目錄的隱藏屬性,只有root用戶可以使用

  • 語法

    chattr [選項] (+|-|=)屬性 文件或目錄
    
    • + 表示增加該屬性
    • - 表示去掉該屬性
    • = 表示去掉其他屬性,只保留該屬性
  • 選項

    • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
  • 屬性

    • a 設置后只能增加數據,而不能刪除或修改數據
    • i 設置后不能被刪除、改名、設定鏈接也無法新增,相當於鎖定
    • s 徹底刪除的屬性,即有該屬性的文件刪除后無法恢復
    • u 當一個應用程序請求刪除這個文件,系統會保留其數據塊以便以後能夠恢復,預防意外刪除
    # 給test.txt文件添加a屬性,使其只能增加數據
    chattr +a /local/test.txt
    
    # 去掉改屬性
    chattr -a /local/test.txt
    

lsattr 命令可以查看隱藏屬性

  • 語法

    lsattr [選項] [文件或目錄]
    
  • 選項

    • -a 显示隱藏文件
    • -d 显示目錄的屬性,而不是目錄中內容
    # 查看test.txt文件的隱藏屬性
    lsattr /local/test.txt
    
    # 查看/local目錄的隱藏屬性
    lsattr -d /local
    
    # 查看當前目錄下的文件或目錄的隱藏屬性,包含吟唱文件
    lsattr -a
    

crontab 定時任務

crontab命令用來管理需要周期性執行的任務,與Windows下的計劃任務類似,依賴於crond服務執行,定時任務的配置文件一般以用戶為單位,放在/var/spool/cron目錄中,執行日誌是/var/log/croncrontab通過cron 表達式來進行定時任務的配置

  • 避免資源分配不均勻,即多個定時任務在同一時間點執行時,盡量錯開
  • 取消不要的輸出選項,將執行結果 >> /dev/null中,避免一直發郵件
  • 一般情況下周與日、月不可同時共存
  • anacron是可喚醒關機期間的工作任務的配置,有檢測機制,針對不24小時開機的服務器,需要的自行百度
# cron表達式 分時日月周:
# .---------------- 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
# *    代表任何時刻
# ,    代表分隔時段
# -    代表時間範圍
# /N   N為数字,表示執行幾次
  • crontab 常用命令

    # 显示當前用戶crontab配置
    crontab -l
    
    # 編輯當前用戶crontab配置
    crontab -e
    
    # root用戶可以幫其他用戶新建/刪除crontab配置
    crontab -u guest
    
  • crontab 配置示例

    # 每1分鐘執行一次
    * * * * * echo $(date) >> /dev/null
    
    # 每5分鐘執行一次後面的命令
    */5 * * * * echo $(date) >> /local/my_crontab.txt
    
    # 每2小時執行一次後面的命令
    * */2 * * * echo $(date) >> /local/my_crontab.txt
    
    # 在3:00與10:00的時候執行一次
    * 3,10 * * * echo $(date) >> /local/my_crontab.txt
    
    # 在10:00到22:00之間每2小時執行一次
    * 10-22/2 * * * echo $(date) >> /local/my_crontab.txt
    
    # 在21:00到21:30之間每5分鐘執行一次
    0-30/5 21 * * * echo $(date) >> /local/my_crontab.txt
    
    # 每周一0點執行一次
    0 0 * * 1 echo $(date) >> /local/my_crontab.txt
    
    # 每年的5月20日00:00分都會給rose發一封情書郵件
    0 0 20 5 * mail rose < /home/jack/lover.txt
    

df 磁盤使用情況

df命令用於显示文件系統的磁盤使用信息

  • 語法

    df [選項] 
    
  • 選項

    • -h 以人類可讀的格式显示(K|M|G)
    • -i 显示inode文件的數量和使用量
    • -T 显示磁盤的文件系統類型
    # 显示磁盤使用情況
    df -h
    # 显示inode信息
    df -hi
    

date 系統時間 / hwclock 硬件時鐘

linux系統有兩個時鐘:一個是由主板電池驅動的硬件時鐘(Real Time Clock),也叫做RTC或者叫CMOS時鐘。當操作系統關機的時候,用這個來記錄時間,但是對於運行的系統是不用這個時間的;另一個時間是系統時鐘(System clock)也叫內核時鐘或者軟件時鐘,是由軟件根據時間中斷來進行計數的,內核時鐘在系統關機的情況下是不存在的,所以,當操作系統啟動的時候,內核時鐘是要讀取RTC時間來進行時間同步。並且在系統關機的時候將系統時間寫回RTC中進行同步。

date 命令比較常用,可以用來显示和設定系統的日期和時間,在显示方面還可以自定義格式

  • 語法

    date [+格式] [選項]
    
  • 格式

    • %Y 年 {0000..9999}
    • %m 月 {1..12}
    • %d 日 {01..31}
    • %H 時 {00..23}
    • %M 分 {00..59}
    • %S 秒 {00..59}
    • %N 納秒 {000000000..999999999}
    • %u 星期 {1..7}
    • %j 一年的第多少天 {001..366}
    • %F 完整的日期,相當於 %Y-%m-%d
    • %T 完整的時間,相當於 %H:%M:%S
    • %R 鐘錶上显示的時間, 相當於 %H:%M
    • %s 從1970-01-01 00:00:00 UTC 到現在的秒數
    # 格式化显示當前系統時間
    [root@God ~]# date "+%F %T.%N"
    2020-06-22 20:34:36.179451922
    
    # 显示今天是今年的第多少天
    [root@God ~]# date "+%j"
    174
    
    # 設置系統時間為2012-12-12 12:12:12
    [root@God ~]# date -s "2012-12-12 12:12:12"
    Wed Dec 12 12:12:12 CST 2012
    [root@God ~]# date
    Wed Dec 12 12:12:12 CST 2012
    
  • 選項

    • -d DATESTR 該選項非常強大,可以根據DATESTR的描述显示時間
    • -s DATESTR 根據DATESTR的描述,設置系統時間,把-d換成-s即可
    # 年year 月month 日day 時hour 分min 秒seconds 
    
    # 显示1天前的時間
    date -d "-1day"
    
    # 显示100天後的時間
    date "+%F %T" -d "+100day"
    
    # 显示新中國成立100周年是哪天
    date "+%F" -d "1949-10-01 +100year"
    # 設置日期為新中國成立100周年那天
    date "+%F" -s "1949-10-01 +100year"
    
  • 硬件時鐘hwclock的常用命令

    # 显示硬件時鐘時間
    hwclock
    
    # 將當前系統時間寫入硬件時鐘
    hwclock -w
    
    # 以系統時鐘為準,同步硬件時鐘
    hwclock --systohc
    
    # 以硬件時鐘為準,同步系統時鐘
    hwclock --hctosys
    
    # 將硬件時鐘設置成指定的時間
    hwclock --set --date="2008-08-08 08:08:08"
    
  • 使用ntpdate命令將本機時間與時間服務器的時間進行同步,沒有這個命令使用yum install ntpdate安裝

    # 將本機時間與阿里雲時間服務器時間進行同步 ntp[1-7].aliyun.com
    ntpdate ntp7.aliyun.com
    

diff 文件比較

diff命令可以快速比較兩個文件或目錄是否有不同

  • 語法

    # 比較文件
    diff [選項] 文件1 文件2
    # 比較目錄
    diff [選項] 目錄1 目錄2
    
  • 選項

    • -b 忽略一行當中僅有多個空白的區別(例如”about me”與”about me”視為相同)
    • -B 忽略空白行的區別
    • -i 忽略大小寫的區別
    # 比較兩個文件
    diff /etc/hosts /etc/hosts.bak
    

echo 標準輸出

echo命令用於打印字符串或變量的值,在shell腳本中極為常用,可以做出進度條效果,也可以打印彩色文字,詳情自行百度

  • 選項

    • -e 開啟轉義字符
    # 轉義:開啟與不開啟的區別
    [root@God test]# echo "Hello \n World"
    Hello \n World
    [root@God test]# echo -e "Hello \n World"
    Hello 
     World
     
    # echo 單引號與雙引號的區別
    [root@God test]# echo "$PATH"
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@God test]# echo '$PATH'
    $PATH
    
    [root@God test]# echo "Hello,World!"
    -bash: !": event not found
    [root@God test]# echo 'Hello,World!'
    Hello,World!
    

find / locate 文件搜索

find支持各種姿勢的查找方式,提供了相當多的查找條件,功能很強大。也正因如此它的選項也很多,有時使用起來也是比較耗費系統資源的,特別是直接從 / 下查找的時候,在實際使用中應盡量縮小查找目錄範圍,把/替換成你指定的查找路徑即可

  • 語法

    find [選項] 查找路徑 查找條件 動作
    
  • 選項

    • -L 跟隨符號鏈接,加上此選項意味着會搜索鏈接指向的目錄
  • 條件

    • -name NAME 根據名稱進行查找,支持通配符
    • -mtime +-DAY 根據修改時間按天查找。如+7代表7天(不含)前,-7代表7天(含)內
    • -mmin +-MIN 根據修改時間按分鐘查找。
    • -type TYPE 根據文件類型查找 TYPE的值有d目錄,f普通文件, l符號鏈接等
    • -size +-SIZE 根據文件大小查找。如+100M代表大於100MB的文件,-50M代表小於50MB的文件
    • -perm MODE 根據文件權限查找
    • -maxdepth N N為数字,表示查找深度
    • -user USER 根據用戶名查找
    • -uid UID 根據用戶ID查找
    • -gid GID 根據組ID查找
    • -empty 查找空文件或空目錄,即大小為0bytes
  • 動作

    • -delete 刪除查找出來的文件,目錄只能刪除空目錄
    • -ok CMD {} \; 交互式執行命令,每次執行前會詢問
    • -exec CMD {} \; 直接執行命令,不詢問
    • 說明
      • {} 表示的是查找出來的結果
      • ; 表示的是結束命令,因為;在各個系統中會有不同的意義,所以在前面的\是轉義字符,為了防止系統出錯。如果你不願意\,使用';'結束也是可以的
    # 查找下1層的目錄
    find / -maxdepth 1 -type d 
    
    # 查找下2層的目錄
    find / -maxdepth 2 -type d 
    
    # 根據名稱精確查找
    find / -name "restart_tomcat.sh"
    
    # 根據名稱模糊查找
    find / -name "*.log"
    
    # 根據修改時間查找
    find / -name "*.log" -mtime +7 
    
    # 查找是否有權限為777的文件
    find / -type f -perm 777 | xargs ls -l
    
    # 找到7天前的日誌文件,直接將其刪除
    find / -type f -name '*.log' -mtime +7 -delete
    
    # 找到7天前的日誌文件,並詢問是否將其刪除
    find / -type f -name '*.log' -mtime +7 -ok rm -rf {} \;
    
    # 找到7天前的日誌文件,直接將其刪除
    find / -type f -name '*.log' -mtime +7 -exec rm -rf {} \;
    
    # 使用 xrags 命令實現刪除
    find / -type f -name '*.log' -mtime +7 | xargs rm -rf
    

locate命令用來查找文件或目錄,要比find命令快很多,原因在於它不搜索具體目錄,而是通過/var/lib/mlocate/mlocate.db自身創建的數據庫進行搜索,這個數據庫含有本地所有文件信息。每天自動更新一次庫中的數據,有時剛創建的文件使用locate搜索不到時就是因為庫中的數據沒有及時更新,為了避免這種情況,在使用locate命令之前可以使用updatedb命令手動更新。如果沒有locate命令,則需要安裝一下yum -y install mlocate

  • 語法

    locate [選項] 查找條件    # 查找條件支持通配符和正則表達式
    
  • 選項

    • -c 只显示找到的數量
    • -i 忽略大小寫
    • -r 使用基礎正則表達式
    • --regex 使用擴展正則表達式
    # 使用前最好先更新一下數據庫
    updatedb
    
    # 查找包含 myfile 的文件和目錄
    locate myfile
    
    # 查找以myfile開頭的文件和目錄
    locate myfile*
    
    # 查找以myfile結尾的文件和目錄
    locate *myfile
    
    # 查找文件名為 1.txt 的文件
    locate -r "/1.txt$"
    

free 查看內存使用

free命令可以显示系統內存的使用情況,包括物理內存、交換內存(swap)和內核緩衝區內存

  • 語法

    free [選項]
    
  • 選項

    • -k 以KB為單位進行显示
    • -m 以MB為單位進行显示
    • -g 以GB為單位進行显示
    • -h 以人類可讀的格式显示(K|M|G)
    • -s N N為数字,表示間隔描述,用於持續觀察內存使用狀況
    # 3秒一刷新,显示內存使用情況
    free -h -s 3
    

head 查看文件前面的內容

head命令用於查看文件頭部或行內頭部的內容

  • 語法

    head [選項] 文件
    
  • 選項

    • -n N N為数字,表示前N行
    • -c N N為数字,表示行內的前N個字節。UTF-8編碼中一個字母佔1字節,一個漢字佔3字節
# 显示前100行內容
head -n 100 /local/

# 显示前5個字節的內容
echo "Hello,World" | head -c 5

history 命令歷史

history 命令用於記錄和显示你在命令行敲過的每一條命令,相鄰的重複命令默認會合併成一個。命令歷史記錄太多會讓系統變得不安全,可以根據自己的需求自定義以下環境變量進行限制

# 記錄命令歷史的文件
HISTFILE=/root/.bash_history
# 記錄命令歷史的文件最大記錄條數
HISTFILESIZE=1000
# 內存中命令歷史的最大記錄條數
HISTSIZE=1000
# 可以通過添加HISTTIMEFORMAT環境變量,記錄命令執行時間
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
  • 語法

    history [選項] 
    
  • 選項

    • N N為数字,显示最近執行過的N條命令
    • -c 清空內存中的歷史命令
    • -rHISTFILE設置的文件中的內容讀取到內存
    • -w-r相反,把內存中的命令歷史寫入到文件中
    # 查看命令歷史
    history
    
    # 執行第66條命令
    !66
    
    # 執行上一條命令
    !!
    

ip 網絡配置管理

ip命令作為iproute2工具包的核心命令,它是linux下管理網絡和流量控制的工具包,旨在替代老牌的工具鏈net-tools,即ifconfig, arp, route, netstat等命令。net-tools通過procfs(/proc)ioctl系統調用去訪問和改變內核網絡配置,而iproute2則通過netlink套接字接口與內核通訊。拋開性能而言,net-tools的用法給人的感覺是比較亂,而iproute2的用戶接口相對net-tools來說相對來說,更加直觀。比如,各種網絡資源(如link、IP地址、路由和隧道等)均使用合適的對象抽象去定義,使得用戶可使用一致的語法去管理不同的對象。如今很多系統管理員依然通過net-tools配置管理網絡,但自2001年起,Linux社區已經對齊停止維護。同時,一些Linux發行版比如Arch Linux和CentOS/RHEL 7則已經完全拋棄了net-tools,只支持iproute2。如果你仍在使用net-tools,而且尤其需要跟上新版Linux內核中的最新最重要的網絡特性的話,那麼是時候轉到iproute2的陣營了。原因就在於使用iproute2可以做很多net-tools無法做到的事情。ip命令非常強大,如果要完全運用的話估計能寫一本書了。這裏就隨用隨加了,需要深入自行查閱官方文檔。

  • 語法

    ip [選項] 對象 {命令}
    
    • ip 命令的選項不支持連着寫,每個都要加-並用空格分隔
  • 選項

    • -c 加上顏色显示
    • -s 显示更多的信息
  • 對象

    • address IP協議設備
    • link 網絡設備
    • route 路由表
    • 所有對象的名稱均支持完整寫法和縮寫,如address可寫成addr add a
    # 查看IP地址
    ip -c addr
    

kill 結束進程

kill命令可以發送一個信號SIGTERM默認為15給進程,可將指定程序終止。程序或工作的編號可以利用ps命令和jobs命令查看

  • 語法

    kill -信號  進程ID|工作ID
    
  • 信號

    • 1 啟動被終止的進程,可讓該PID重新讀取自己的配置文件,類似重新啟動
    • 2 相當於用鍵盤Ctrl+c來中斷一個進程的進行
    • 9 強制中斷一個進程的執行,如果該進程進行到一半,那麼尚未完成的部分可能會有”半產品”產生,比如vim會有.filename.swp保留下來
    • 15 以正常的進程結束方式來結束進程
    • 17 相當於用鍵盤Ctrl+z來暫停一個進程的進行
    # 強制結束PID為8886的進程
    kill -9 8886
    
    # 強制結束JOBNUMBER為2的進程
    kill -9 %2
    
    # 強制結束所有的以httpd啟動的進程
    killall -9 httpd
    

ln 創建鏈接(快捷方式)

ln 命令可以為文件或目錄創建一個鏈接(link),鏈接可分為兩種:硬鏈接和軟鏈接。軟鏈接相當於windows下的快捷方式

  • 語法

    ln [選項] 源  目標
    
  • 選項

    • -s 創建為軟鏈接
    # 在家目錄下創建一軟連接
    ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ifcfg-ens33
    

ls 查看目錄中的內容

ls命令用於显示指定工作目錄下之內容(列出目前工作目錄所含之文件及子目錄)。ll命令是系統自帶的一個別名命令,主要用於進行長列表显示內容

  • 語法

    ls [選項] [文件或目錄]
    
  • 選項

    • -a 显示所有內容,包括隱藏文件
    • -d 显示目錄本身,而不是目錄中的內容
    • -t 按照時間進行排序,最新的在最上面
    • -r 對排序進行翻轉
    • -l 使用長列表显示內容
    • -h 以人類可讀的格式显示(K|M|G)
    • --full-time 显示精確時間
    # 显示目錄下的所有內容
    ls -a 
    
    # 快速找到修改時間最新的文件,最下面那個就是
    ls -lrth
    

less 分頁查看文件

less是對文件或其他輸出進行分頁显示的工具,功能十分強大,而且不會一開始就加載整個文件,在性能和用法上比more更加的有彈性。使用less命令打開的內容可以使用各種功能按鍵來操作,個人感覺完全可以替代more,所以有人說less is more,相比於more,我更喜歡用less

  • 語法

    less [選項] 文件
    
  • 選項

    • -s 显示連續的空行為一個空行
    • -N 显示行號
    • -m 显示類似於more命令的百分比
    • -g 只標記最後搜索的關鍵詞
    • -i 搜索時忽略大小寫
  • 按鍵

    • h 查看幫助
    • ↑↓ 向上或向下一行
    • b 向上滾動一頁 PageUp
    • space 向下滾動一頁 PageDown
    • g 移動到第一行
    • G 移動到最後一行
    • N g/G N為数字,移動到第N行
    • q/Q 退出
    • / KEYWORD 進入向下搜索模式,可根據關鍵字進行搜索,n繼續往下找,N繼續往上找
    • & KEYWORD 輸入關鍵字,可僅显示包含關鍵字的行
    • F 類似於tail -f,實時讀取文件最新內容,按ctrl + c 停止
    # 使用 less 命令查看文件
    less -smN /etc/service
    
    # 使用 less 命令接收其他命令的標準輸出
    history | Dless
    

mv 剪切 / 重命名 文件或目錄

mv命令用來為文件或目錄重命名或移動文件或目錄(剪切)

  • 語法

    mv [選項] 源 目標
    
  • 選項

    • -i 若指定目錄已有同名文件,則先詢問是否覆蓋舊文件;
    • -f 如果目標存在,直接覆蓋不提示
    # 移動文件/local/hosts.bak到/local目錄下
    mv /etc/hosts.bak /local
    
    # 重命名文件hosts.bak為hosts
    mv /etc/hosts.bak /etc/hosts
    

mkdir 創建目錄

mkdir命令用來創建目錄

  • 語法

    mkdir [選項] 目錄
    
  • 選項

    • -m 創建目錄的同時設置權限
    • -p 如果父目錄不存在,則創建
    # 創建目錄/local/script,如果目錄/local不存在,會報錯
    mkdir /local/script
    
    # 創建目錄/local/script,如果目錄/local不存在,則創建
    mkdir -p /local/script
    
    # 創建目錄/local/script,如果目錄/local不存在,則創建,並給script目錄設定755的權限分數
    mkdir -pm 755 /local/script
    

ps 查看進程

ps命令用於显示當前進程的狀態,這個狀態是當前那些進程的快照,如果想要動態查看進程,請使用top命令,常用來通過管道命令搭配grep命令進行查詢,然後通過kill命令,刪除不需要的進程

  • 語法

    ps [選項]
    
  • 選項

    • -e 显示所有進程
    • -f 显示全格式列表,增加 UID、PPID、C與STIME欄位的显示
    # 根據關鍵字查找進程
    ps -ef | grep tomcat
    

pwd 显示當前目錄

pwd用於显示當前所在的路徑,加-P可显示真實路徑,而非鏈接路徑

[root@God /]# ll -d /sbin
lrwxrwxrwx. 1 root root 8 Jun 21 11:20 /sbin -> usr/sbin
[root@God /]# cd sbin/
[root@God sbin]# pwd    
/sbin
[root@God sbin]# pwd -P  
/usr/sbin

passwd 修改密碼

passwd可以用來更改用戶的密碼,還可以鎖定與解鎖用戶

  • 語法

    passwd [選項] 用戶
    
  • 選項

    • -d 刪除密碼
    • -f 強迫用戶下次登錄時必須修改密碼
    • -w 設置密碼到期前提前警告的天數
    • -l 鎖定賬戶
    • -u 解鎖賬戶
    • -x 設置密碼有效天數
    # 修改當前用戶的密碼
    passwd
    
    # 修改其他用戶的密碼,root用戶修改其他用戶密碼,不需要提供原密碼
    passwd jack
    
    # 鎖定用戶
    passwd -l jack
    
    # 解鎖鎖定的用戶
    passwd -u jack
    

rm 刪除文件或目錄

rm 用於刪除文件或目錄,生產服務器執行刪除命令前一定要備份

  • 語法

    rm [選項] 文件或目錄
    
  • 選項

    • -i 刪除前詢問
    • -f 直接刪除,不確認
    • -r 刪除目錄時使用,否則無法刪除目錄
    # 刪除目錄下所有內容,並且不經過確認,慎用
    rm -rf /local
    
    # rm 刪除目錄下所有隱藏文件
    rm /local/.*
    
    # rmdir 只能刪除空目錄,目錄不為空無法刪除
    rmdir /local
    

su 切換用戶

su命令用於切換當前用戶,除了root外,需要輸入該用戶的密碼

su命令和su -命令最大的本質區別就是:前者只是切換了root身份,但Shell環境仍然是普通用戶的Shell;而後者連用戶和Shell環境一起切換成root身份了。只有切換了Shell環境才不會出現PATH環境變量錯誤。su切換成root用戶以後,pwd一下,發現工作目錄仍然是普通用戶的工作目錄;而用su -命令切換以後,工作目錄變成root的工作目錄了。用echo $PATH命令看一下susu -以後的環境變量有何不同。以此類推,要從當前用戶切換到其它用戶也一樣,應該使用su -命令。

# 切換到用戶執行命令,命令執行完在自動切換回來
[root@God ~]# su jet -c ls
ls: cannot open directory .: Permission denied
[root@God ~]# su - jet -c ls
1.txt

stat 查看文件詳細信息

stat命令可以查看文件的詳細信息

  • 語法

    stat [選項] 文件
    
  • 選項

    • -c FORMAT 格式化显示 FORMAT的取值可以查看幫助
    # 查看文件的權限
    [root@God ~]# stat -c %A testfile 
    -rw-r--r--
    [root@God ~]# stat -c %a testdir/
    755
    

sort 排序 / uniq 去重

sort命令用於對文本內容或者是對其他命令的輸出進行排序显示。

  • 語法

    sort [選項] 文件
    
  • 選項

    • -u 合併重複的行
    • -r 反向排序
    • -g 按照数字大小排序
    • -t SEP 按照SEP進行分列,默認為空格
    • -k N N為数字,表示根據第N列排序
    # 根據進程號排序查看進程
    ps -ef | sort -rgk 2
    

uniq 命令用於去除重複的行,一般與sort搭配使用

  • 語法

    uniq [選項]  源數據
    
  • 選項

    • -c 統計重複行出現的次數
    • -d 僅显示重複出現的行
    • -u 僅显示出現一次的行
    # 統計IP地址出現的次數
    cat ip.txt | sort | uniq -c 
    

split 分割文件

split可以將大文件分割成若干個小文件

  • 語法

    split [選項] 文件 前綴
    
  • 選項

    • -d 給文件添加数字後綴
    • -b SIZE 根據大小進行分割,可以添加單位(b|k|m|g)等
    • -l N N為數字錶示行數,按照行數進行分割
    # 將catalina.out按照300m的大小進行分割,分割的文件會以catalog00,catalog01,catalog02的方式來建立
    split -db 300m catalina.out catalog
    
    # 將分割后的若干個小文件在還原
    more catalog* >> catalina.out
    

tar 打包

tar 命令用來打包或壓縮文件,選項相當多。一般只打包不壓縮的文件以.tar結尾,通過gzip進行打包壓縮的文件以.tar.gz結尾,通過bzip2進行打包壓縮的文件以.tar.bz2 結尾

  • 語法

    tar [選項] 壓縮文件名 操作目標
    
  • 選項

    • -c 創建打包文件
    • -x 釋放打包文件
    • -t 查看包文件內容
    • -v 显示詳細過程
    • -z 使用gzip的方式進行壓縮或解壓
    • -j 使用bzip2的方式進行壓縮或解壓
    • -h 同時打包鏈接指向的文件
    • -C 指定解壓目錄
    # 將目錄/local進行打包並使用gzip進行壓縮
    tar -zcvf local.tar.gz /local
    
    # 將local.tar.gz進行解壓並將打包文件釋放到當前目錄
    tar -zxvf local.tar.gz
    
    # 僅解壓指定的檔案local/script到當前工作目錄
    tar -zxvf local.tar.gz local/script
    
    # 將目錄/local進行打包並使用gzip進行壓縮,但排除以.log結尾的文件
    tar -zcvf local.tar.gz --exclude=*.log /local
    

top 動態查看進程

top命令可以實時的查看系統運行的整體情況,是一個綜合了多方信息監測系統性能和運行信息的實用工具。

  • 語法

    top [選項]
    
  • 選項

    • -d N N為数字,表示刷新秒數間隔
    • -b 以追加的方式显示結果
    • -n N N為数字,表示刷新次數
    • -p PIDLIST 只显示指定PID的進程,多個PID之間用,分隔
    • -u USER 只显示指定用戶的進程
    # 以1秒的時間間隔來動態查看進程
    top -d 1
    
    # 查看進程ID為 1 12 38 的進程信息
    top -d 1 -p 1,12,38
    

tail 查看文件末尾內容

tail 命令和head命令相反,用於查看文件末尾的內容,而且可以實時刷新

  • 語法

    tail [選項] 文件
    
  • 選項

    • -n N N為数字,表示末尾N行
    • -c N N為数字,表示行內的末尾的N個字節。UTF-8編碼中一個字母佔1字節,一個漢字佔3字節
    • -f 實時刷新显示文件內容
    # 實時查看文件/local/mylog.log末尾100行的內容
    tail -100f  /local/mylog.log
    

touch 修改文件的時間屬性或創建空文件

touch命令用於修改文件或者目錄的時間屬性,若文件不存在,則創建一個新的空文件。Linux下的三個時間屬性概念分別是atime(access time)讀取時間 、 mtime(modify time)修改時間、ctime(change time),注意ctime不是create time。實際工作中使用touch修改這些時間屬性的需求極少,相反大多數是用來創建一個或多個空文件。有點喧賓奪主的意思~

  • 語法

    touch [選項] 文件或目錄
    
  • 選項

    • -a 修改文件或目錄的讀取時間
    • -m 修改文件或目錄的修改時間
    • -t STAMP 指定時間戳,格式為[YYYY]MMDDhhmm[.ss]
    • -c 如果文件不存在,不要創建文件
    # 使用{}可一次性創建多個空文件,如 {1..10}  {a..z}  {1,3,5,7,9}
    # 創建一個空文件
    touch olympic.txt
    
    # 創建99空文件
    touch olympic{1..99}.txt
    
    # 修改文件的修改時間 mtime
    touch -cmt 200808080808.08 olympic.txt
    

useradd / groupadd 用戶和組管理

Linux系統是一個多用戶多任務的分時操作系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個賬號,然後以這個賬號的身份進入系統。用戶的賬號一方面可以幫助系統管理員對使用系統的用戶進行跟蹤,並控制他們對系統資源的訪問;另一方面也可以幫助用戶組織文件,併為用戶提供安全性保護。每個用戶賬號都擁有一個唯一的用戶名和各自的密碼。用戶在登錄時鍵入正確的用戶名和密碼后,就能夠進入系統和自己的家目錄。

  • 添加用戶

    # 添加一個普通用戶,不指定組的話會自動創建一個同名組
    useradd jack 
    
    # 添加一個普通用戶,並指定現有的組(組必須先存在)
    useradd -g root jet
    
    # 添加一個系統用戶,並不讓其登錄 -r 代表系統用戶,系統用戶不會有家目錄
    useradd -r -s /sbin/nologin  rose 
    
  • 刪除用戶

    # 只刪除用戶
    userdel jack
    
    # 刪除用戶,並刪除該用戶的家目錄(包括目錄中的內容)
    # 家目錄外的用戶所屬文件會替換成用戶ID,當有新的用戶使用這個ID時,該文件自動歸屬新用戶
    userdel -r jack
    
  • 修改用戶

    # 修改用戶的初始用戶組,通過名稱修改
    usermod -g root jack
    
    # 修改用戶的初始用戶組,通過GID修改
    usermod -g 888 jack
    
    # 相當於passwd -l,鎖定用戶
    usermod -L jack
    
    # 相當於passwd -u,解除鎖定
    usermod -U jack 
    
    # 禁止用戶登錄
    usermod -s /sbin/nologin jack
    
    # 修改用戶ID
    usermod -u 888 jack
    
  • 查看用戶

    # 查看當前用戶
    id
    
    # 查看當前登錄的用戶
    w
    
    # 查看所有的用戶
    cat /etc/passwd
    cat /etc/passwd | cut -d ':' -f 1
    
  • 添加用戶組

    # 建立一個一般用戶組
    groupadd mygroup
    
    # 建立一個系統用戶組
    groupadd -r admingroup
    
  • 刪除用戶組

    # 刪除用戶組
    groupdel admingroup
    
  • 修改用戶組

    # 修改組ID
    groupmod -g 888 mygroup
    
    # 修改組名稱 CIA為新名稱
    groupmod -n CIA mygroup
    
  • 查看用戶組

    cat /etc/group
    

vi / vim 文本編輯器

vivim用法基本一致,它們的關係有些類似於Windows下notepad與notepad++的關係,不過vim有時默認沒有安裝,需要yum -y install vim手動安裝一下。因為vim相比vi,功能更強大,又有語法高亮等功能。所以個人還是習慣並推薦使用vim。下面介紹的vim的使用方法,通常在vi上同樣適用,網上介紹vim使用的方式基本上就是說在三種模式下使用總結,即命令模式、輸入模式、底線命令模式,介紹十分詳盡,簡直快把整個vim的幫助給弄下來了。我這裏介紹的常用操作為單位,不是很全,但日常使用應該足夠了。

  • 打開文件

    # 打開一個文件
    vim /tmp/yum.log
    
    # 按 ctrl+w 然後按 上下左右鍵 可在窗口之間切換
    # 打開多個文件,縱向窗口分割,左右一邊一個窗口
    vim -O /etc/hosts /etc/hosts.bak
    # 打開多個文件,橫向窗口分割,上下一遍一個窗口
    vim -o /etc/hosts /etc/hosts.bak
    
  • 編輯文本

    • 打開文件后,按i鍵可在光標處插入內容;按o鍵可在光標處的下一行插入內容。此時底部會显示-- INSERT --字樣,按Esc鍵可退出編輯模式
  • 快速定位

    • : set nu 显示行號, 按 : 然後輸入set nu敲回車
    • : set nonu 取消显示行號
    • : N N為数字,表示行號,按 : 然後輸入11,敲回車即可快速移動光標到第11行,輸入$則移動到最後一行
    • N% N為数字,表示百分比,比如按58然後按一下%,即可移動光標到文件58%的部分
    • H | M | L 按這三個鍵可快速移動光標到屏幕的頂部、中間、底部位置
    • ctrl+u 往上翻半頁
    • ctrl+d 往下翻半頁
    • ↑↓←→ 移動光標
    • Home/End 移動光標到行首或行末
    • PageUp/PageDown 翻頁
  • 快速編輯

    • N yy N為数字,複製光標所在行以下的N行,默認N為1,即當前行。如複製 20 行,就按20,然後按yy就複製了
    • N ddyy用法一樣,只不過它是剪切。所以它也能當刪除使用
    • p 在光標所在行的下一行粘貼剛複製或剪切的內容
    • uu鍵,撤銷剛才的操作
    • ctrl+r 反撤銷
    • v 進入視圖模式,可通過上下左右移動光標選擇一片文本,此時底部會显示-- VISUAL --字樣(按Esc鍵可退出視圖模式)然後按y複製或按d剪切,按p在光標處後面粘貼
    • Vv一樣,只不過是以行為單位
    • ctrl+vv一樣,只不過是以列為單位,類似於在notepad++中,按住Alt選文字
  • 查找

    • / KEYWORD/進入查找,在底部/的後面輸入想查找的內容,按回車搜索,然後按n往下繼續查找,按N往上查找
  • 替換

    • :%s#OLD#NEW#gic 個人習慣先按:%s###g,然後移動光標到OLD位置輸入要替換的字符串,在移動光標到NEW位置,輸入新字符串,敲回車進行文字替換,%表示全文,不加代表當前行,用10,20替換百分號則表示替換10到20行;後面的gicg表示全局替換不加只替換每行的第一個;i 表示忽略大小寫,c表示在替換前進行確認,需要哪個加哪個
  • 退出和保存

    • Esc 當你進入編輯模式、命令模式等其他模式時,都可按Esc鍵退出
    • :w 保存
    • :wq 保存並退出
    • q! 強制退出不保存

wc 統計字數行數

wc命令可以統計字節數、行數、單詞數

  • 語法

    wc [選項] 文件
    
  • 選項

    • -l 統計行數
    • -c 統計字節數
    • -m 統計字符數
    # 依次列出/etc/passwd中的 行數、字數、字符數
    wc /etc/passwd
    
    # 查看有多少個進程數
    ps -ef | wc -l
    

xargs 參數傳遞

xargs是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,它可以將管道或標準輸入的數據轉換成命令行參數,也能夠從文件的輸出中讀取數據。它能夠捕獲一個命令的輸出,然後傳遞給另外一個命令,一般與管道在一起使用

# 找到修改日期在7天前的日誌,並將其刪除
find /local/server -name "*.log" -mtime +7 | xargs rm -rf

yum 紅帽系列包管理工具

yum,是Yellow dog Updater, Modified 的簡稱,是杜克大學為了提高RPM 軟件包安裝性而開發的一種軟件包管理器,適用於Redhat系列的系統。用python寫成,yum 的宗旨是自動化地升級,安裝/移除rpm 包,收集rpm 包的相關信息,檢查依賴性並自動提示用戶解決。yum 主要功能是更方便的添加/刪除/更新rpm 包,自動解決包的依賴性問題,便於管理大量系統的更新問題。yum 可以同時配置多個資源庫(Repository),簡潔的配置文件(/etc/yum.conf),自動解決增加或刪除rpm包時遇到的依賴性問題。

  • 語法

    yum [選項] 命令 [包名]
    
  • 選項

    • -y 對所有的確認都回答yes
  • 命令

    • install PACKAGE 安裝包,PACKAGE替換成要安裝的包名
    • update PACKAGE 更新包
    • remove PACKAGE 卸載包
    # 安裝 vim 
    yum -y install vim
    

zip / unzip 壓縮與解壓

zip 是個廣泛使用的壓縮程序,壓縮后的文件後綴名為.zip

# 將當前目錄下所有txt文本壓縮在一起
zip txt.zip *.txt

# 將目錄/local壓縮成local.zip文件
zip -r local.zip /local

# 將local.zip解壓縮到指定目錄,不加-d選項,則解壓到當前目錄
unzip local.zip -d ~/

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

大數據:全球1/3碳排放 來自這20間公司

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

歐盟執委會副主席被提名人 力挺2030碳排降50%目標

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

落實低碳城市 荷蘭阿姆斯特丹機場提供百餘輛 Tesla 租賃

  近日美國電動車廠 Tesla 宣布與荷蘭當地租車公司合作,提供阿姆斯特丹 Schiphol 機場旅客 Model S 租車方案。   對於素有「腳踏車烏托邦」美名之稱的荷蘭而言,出門不開車不是一個選項,而是一個自然不過的習慣,甚至推行各項自然發電方式,其中阿姆斯特丹更是打造成低碳城市,在政府的綠能政策下,電動的推行早已行之有年。   而這次由荷蘭 BBF Schipholtaxi 與 BIOS-groep 兩大租車公司通力合作,一口氣導入 167 輛特斯拉 Model S 加入汽車租賃,以首都阿姆斯特丹主要機場史基浦(Schiphol)國際機場作為出租據點,鎖定國際旅客與國內高端客群,也替低碳城市計畫盡一份心力。     (Source:)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準