場景
電腦或服務(wù)器開機(jī)都會有一些需要啟動的程序咆爽,每次都需要一個一個點(diǎn)擊啟動球拦,耗時耗力,還有可能漏啟動续搀。所以添加一個開機(jī)自啟的腳本塞琼,腳本中幫我們打開需要啟動的程序,如Snipaste目代、FRP客戶端等屈梁。
CentOS
方式一:添加啟動命令到rc.local文件中
修改 /etc/rc.local 文件,添加啟動服務(wù)的命令
先寫好啟動腳本或者啟動命令榛了,事先保證啟動腳本或命令能正常啟動服務(wù)在讶,然后將腳本路徑或啟動命令添加至/etc/rc.local文件中,這個方法適合比較簡單的shell腳本霜大。
方式二:注冊服務(wù)并設(shè)置開機(jī)自啟
創(chuàng)建腳本myservice构哺,寫入
#!/bin/bash
# chkconfig: 234 10 90
# description: myservice ...
case $1 in
"start")
date >> /tmp/test.txt
echo "service start" >> /tmp/test.txt
;;
"stop")
date >> /tmp/test.txt
echo "service stop" >> /tmp/test.txt
;;
esac
NOTE:其中2345是默認(rèn)啟動級別,級別有0-6共7個級別战坤。
- 等級0表示:表示關(guān)機(jī)
- 等級1表示:單用戶模式
- 等級2表示:無網(wǎng)絡(luò)連接的多用戶命令行模式
- 等級3表示:有網(wǎng)絡(luò)連接的多用戶命令行模式
- 等級4表示:不可用
- 等級5表示:帶圖形界面的多用戶模式
- 等級6表示:重新啟動
- 10是啟動優(yōu)先級曙强,90是停止優(yōu)先級,優(yōu)先級范圍是0-100途茫,數(shù)字越大碟嘴,優(yōu)先級越低。
將腳本放到/etc/init.d或/etc/rc.d/init.d目錄下囊卜,并添加腳本為服務(wù)
chkconfig --add myservice
NOTE:此時調(diào)用chkconfig --list myservice命令娜扇,得到如下啟動等級
myservice 0:off 1:off 2:on 3:on 4:on 5:on 6:off
輸入如下命令調(diào)用myservice服務(wù),然后查看/tmp下的test.txt文件發(fā)現(xiàn)已經(jīng)寫入了日期栅组。
systemctl start myservice
NOTE:對服務(wù)的操作就相當(dāng)于在調(diào)用對應(yīng)的腳本
service httpd 等價 /etc/rc.d/init.d/httpd
service httpd start 等價 /etc/rc.d/init.d/httpd start
service httpd stop 等價 /etc/rc.d/init.d/httpd stop
systemctl start myservice 等價 /etc/rc.d/init.d/myservice start
將myservice服務(wù)設(shè)置為開機(jī)自啟
systemctl enable myservice
NOTE:如果啟動等級是2345雀瓢,則已經(jīng)是開機(jī)自啟了,可以省略這步玉掸。
查看服務(wù)是否開機(jī)啟動
systemctl is-enabled myservice
重啟服務(wù)器刃麸,就會執(zhí)行systemctl start myservice
命令和rc.local
中的命令。
方式三
編輯腳本
[Unit]
Description=node_export
Documentation=https://github.com/prometheus/node_exporter
After=network.target
Wants=network.target
[Service]
Type=simple
User=hxr
ExecStart= /opt/module/node_exporter-1.2.2/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
配置中多個相同配置會選擇最后一個司浪;所有的啟動設(shè)置之前泊业,都可以加上一個連詞號(-)把沼,表示"抑制錯誤",即發(fā)生錯誤的時候吁伺,不影響其他命令的執(zhí)行智政。EnvironmentFile=-/etc/sysconfig/sshd,表示即使 /etc/sysconfig/sshd 文件不存在箱蝠,也不會拋出錯誤
[Unit] 啟動順序與依賴關(guān)系:
Description:當(dāng)前服務(wù)的簡單描述;
Documentation:指定 man 文檔位置垦垂;
After:如果network.target 需要啟動宦搬,那么 sshd.service 應(yīng)該在它們之后啟動;
Before:定義 本服務(wù) 應(yīng)該在哪些服務(wù)之前啟動劫拗。After 和 Before 字段只涉及啟動順序间校,不涉及依賴關(guān)系;
Wants:表示 network.target 之間存在"弱依賴"關(guān)系页慷,即如果"network.target"啟動失敗或停止運(yùn)行憔足,不影響 本服務(wù) 繼續(xù)執(zhí)行;
Requires:表示"強(qiáng)依賴"關(guān)系酒繁,即如果該服務(wù)啟動失敗或異常退出滓彰,那么 本服務(wù) 也必須退出 。 Wants 字段與Requires 字段只涉及依賴關(guān)系州袒,與啟動順序無關(guān)揭绑,默認(rèn)情況下是同時啟動。[Service] 啟動行為:
EnvironmentFile:許多軟件都有自己的環(huán)境參數(shù)文件郎哭,該字段指定文件路徑(注意:/etc/profile 或者 /etc/profile.d/ 這些文件中配置的環(huán)境變量僅對通過 pam 登錄的用戶生效他匪,而 systemd 是不讀這些配置的。systemd 是所有進(jìn)程的父進(jìn)程或祖先進(jìn)程夸研,它的環(huán)境變量會被所有的子進(jìn)程所繼承邦蜜,如果需要給 systemd 配置默認(rèn)參數(shù)可以在/etc/systemd/system.conf 和 /etc/systemd/user.conf 中設(shè)置。 加載優(yōu)先級system.conf 最低亥至,可能會被其他的覆蓋)悼沈;
Type:定義啟動類型√Т常可設(shè)置:simple井辆,exec,forking溶握,oneshot杯缺,dbus,notify睡榆,idle萍肆。
simple(設(shè)置了 ExecStart= 但未設(shè)置 BusName= 時的默認(rèn)值):ExecStart 字段啟動的進(jìn)程為該服務(wù)的主進(jìn)程
forking:ExecStart 字段的命令將以 fork() 方式啟動袍榆,此時父進(jìn)程將會退出,子進(jìn)程將成為主進(jìn)程塘揣。
ExecStart:定義啟動進(jìn)程時執(zhí)行的命令 上面的例子中包雀,啟動 sshd 執(zhí)行的命令是 /usr/sbin/sshd -D $OPTIONS,其中的變量 $OPTIONS 就來自 EnvironmentFile 字段指定的環(huán)境參數(shù)文件亲铡。
ExecReload:重啟服務(wù)時執(zhí)行的命令 ExecStop:停止服務(wù)時執(zhí)行的命令 才写;
ExecStartPre:啟動服務(wù)之前執(zhí)行的命令;
ExecStartPost:啟動服務(wù)之后執(zhí)行的命令 ExecStopPost:停止服務(wù)之后執(zhí)行的命令奖蔓;
RemainAfterExit:設(shè)為yes赞草,表示進(jìn)程退出以后,服務(wù)仍然保持執(zhí)行吆鹤;
KillMode:定義 Systemd 如何停止服務(wù)厨疙,可以設(shè)置的值如下:
control-group(默認(rèn)值):當(dāng)前控制組里面的所有子進(jìn)程,都會被殺掉 process:只殺主進(jìn)程 mixed:主進(jìn)程將收到 SIGTERM 信號疑务,子進(jìn)程收到 SIGKILL 信號 none:沒有進(jìn)程會被殺掉沾凄,只是執(zhí)行服務(wù)的 stop 命令;
Restart:定義了退出后知允,Systemd 的重啟方式撒蟀。可以設(shè)置的值如下: no(默認(rèn)值):退出后不會重啟
on-success:只有正常退出時(退出狀態(tài)碼為0)温鸽,才會重啟
on-failure:非正常退出時(退出狀態(tài)碼非0)牙肝,包括被信號終止和超時,才會重啟 on-abnormal:只有被信號終止和超時嗤朴,才會重啟
on-abort:只有在收到?jīng)]有捕捉到的信號終止時配椭,才會重啟 on-watchdog:超時退出,才會重啟
always:不管是什么退出原因雹姊,總是重啟股缸;
RestartSec:表示 Systemd 重啟服務(wù)之前,需要等待的秒數(shù)[Install]啟動行為:
WantedBy:表示該服務(wù)所在的 Target(服務(wù)組) 吱雏。關(guān)于 Target敦姻,運(yùn)行級別結(jié)果為 multi-user.target,表示默認(rèn)的啟動 Target 是multi-user.target歧杏。在這個組里的所有服務(wù)镰惦,都將開機(jī)啟動。這就是為什么 systemctl enable
命令能設(shè)置開機(jī)啟動的原因犬绒。shutdown.target 就是關(guān)機(jī)狀態(tài)旺入。常用的 Target 有兩個:一個是 multi-user.target,表示多用戶命令行狀態(tài);另一個是 graphical.target茵瘾,表示圖形用戶狀態(tài)礼华,它依賴于 multi-user.target systemctl isolate shutdown.target。
根據(jù)實(shí)際情況修改Service中的User和ExecStart的屬性拗秘,然后將將本放到 /usr/lib/systemd/system/node_exporter.service
路徑下圣絮。
設(shè)為開機(jī)自啟動
systemctl enable node_exporter.service
會將文件路由到 /etc/systemd/system/multi-user.target.wants/ 目錄下
可以通過如下命令查看日志信息
journalctl -u node_exporter -n 10 -f
Windows
- 創(chuàng)建.bat腳本,輸入啟動命令
start /min C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.exe -c C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.ini
start E:\Snipaste\Snipaste.exe
start "" "C:\Program Files (x86)\iNode\iNode Client\iNode Client.exe"
- 將腳本放到系統(tǒng)啟動文件夾C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup中(或在運(yùn)行框中輸入shell:startup打開用戶啟動文件夾C:\Users\CJ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)
NOTE:frpc.exe啟動時會打開cmd窗口雕旨,可以加上/min來最小化cmd窗口扮匠。
NOTE:Win中沒有l(wèi)inux中的nohup(忽略SIGHUP指令)和&(忽略SIGINT指令)命令來掛起程序使其在后臺運(yùn)行,如果希望其在后臺運(yùn)行凡涩,可以隱藏窗口餐禁。
網(wǎng)上找了以下兩種方式,但是都不管用╯﹏╰
方式一:@echo off if "%1" == "h" goto begin mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit :begin start /min >C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.exe -c >C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.ini start E:\Snipaste\Snipaste.exe
方式二:
再寫一個vbs文件突照,在該文件中以隱藏的方式啟動bat腳本Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c start.bat",vbhide