dotnet core 網(wǎng)站發(fā)布后如何重啟服務(wù)的解決

dotnet core 網(wǎng)站一個(gè)痛點(diǎn)是不會(huì)自動(dòng)重啟。

ftp上傳更新后需要查找原先的進(jìn)程,kill掉那個(gè)進(jìn)程唱歧,然后啟動(dòng)。

想想原先dotnet ftp直接覆蓋就ok了粒竖,不用啟動(dòng)一個(gè)shell颅崩,登陸,ps -aux|grep dotnet 蕊苗,找到那個(gè)進(jìn)程沿后, kill 進(jìn)程號(hào),然后 到 網(wǎng)站目錄下朽砰,nohup dotnet xxx.dll &? .

我想尖滚,可以寫個(gè)小程序,進(jìn)行這幾步操作瞧柔。

但有個(gè)問(wèn)題漆弄,怎么知道文件改動(dòng)了。想到有個(gè)FileSystemWatcher的類造锅,能夠解決這個(gè)問(wèn)題撼唾。

最初是考慮監(jiān)視 .dll 文件 ,后來(lái)想哥蔚,如果有多個(gè) .dll 文件倒谷,一個(gè)替換就啟動(dòng)一次,那不是需要啟動(dòng)多次嗎肺素?后來(lái)考慮延時(shí)啟動(dòng)恨锚,比如 10秒后,.dll文件沒(méi)有被替換了倍靡,就重啟猴伶,但延時(shí)的時(shí)間不好控制。后來(lái)想塌西,是不是考慮復(fù)雜了他挎。直接設(shè)置一個(gè)文件,如果文件存在就重啟捡需,監(jiān)視程序重啟后把那個(gè)文件刪除不就可以了办桨。web發(fā)布的時(shí)候把那個(gè)文件設(shè)為總是復(fù)制。ftp上傳的時(shí)候最后上傳這個(gè)文件就可以了站辉。

寫好代碼呢撞,測(cè)試损姜。通過(guò)。

Program.cs

using System;

using System.IO;

using System.Configuration;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.Configuration.Json;

using System.Diagnostics;

namespace dog

{

? ? class Program

? ? {

? ? ? ? static void read_config()

? ? ? ? {

? ? ? ? ? ? var builder = new ConfigurationBuilder();

? ? ? ? ? ? builder.AddJsonFile("dog.json");

? ? ? ? ? ? IConfigurationRoot config =? builder.Build();?

? ? ? ? ? ? file_path = config["file_path"];

? ? ? ? ? ? command = config["command"];

? ? ? ? ? ? argument = config["argument"];

? ? ? ? ? ? find = config["find"];

? ? ? ? ? ? debug_file = config["debug_file"];

? ? ? ? ? ? command2 = config["command2"];

? ? ? ? ? ? argument2 = config["argument2"];

? ? ? ? ? ? watch_create_file = config["watch_create_file"];

? ? ? ? }

? ? ? ? public static string file_path = "";

? ? ? ? public static string? command = "";

? ? ? ? public static string? argument = "";

? ? ? ? public static string? find = "";

? ? ? ? public static string? debug_file = "";

? ? ? ? public static string? command2 = "";

? ? ? ? public static string? argument2 = "";

? ? ? ? public static string watch_create_file = "";

? ? ? ? static void restart()

? ? ? ? {


? ? ? ? ? ? string pid = "";

? ? ? ? ? ? var psi = new System.Diagnostics.ProcessStartInfo(command, argument);

? ? ? ? ? ? psi.RedirectStandardOutput = true;

? ? ? ? ? ? using (var process = System.Diagnostics.Process.Start(psi))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var output = process.StandardOutput.ReadToEnd();

? ? ? ? ? ? ? ? string[] lines = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

? ? ? ? ? ? ? ? foreach(string aLine in lines)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if (aLine.IndexOf(find) != -1)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? string[] lines2 = aLine.Split(new string[]{" "},StringSplitOptions.RemoveEmptyEntries);

? ? ? ? ? ? ? ? ? ? ? ? pid = lines2[1];

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? if(pid!=""){

? ? ? ? ? ? ? ? command = "kill";

? ? ? ? ? ? ? ? argument = pid;

? ? ? ? ? ? ? ? psi = new System.Diagnostics.ProcessStartInfo(command, argument);

? ? ? ? ? ? ? ? psi.RedirectStandardOutput = true;

? ? ? ? ? ? ? ? using (var process = System.Diagnostics.Process.Start(psi))

? ? ? ? ? ? ? ? {


? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? psi = new System.Diagnostics.ProcessStartInfo(command2, argument2);

? ? ? ? ? ? ? ? psi.RedirectStandardOutput = true;

? ? ? ? ? ? ? ? using (var process = System.Diagnostics.Process.Start(psi))

? ? ? ? ? ? ? ? {


? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? static void Main(string[] args)

? ? ? ? {

? ? ? ? ? ? read_config();? ? ? ? ?

? ? ? ? ? ? WatcherStrat(file_path, "*.prop");? ? ? ? ? ?

? ? ? ? ? ? Console.ReadKey();? ? ? ?

? ? ? ? }

? ? ? ? private static void WatcherStrat(string path, string filter)

? ? ? ? {

? ? ? ? ? ? FileSystemWatcher watcher = new FileSystemWatcher();

? ? ? ? ? ? watcher.Path = path;

? ? ? ? ? ? watcher.Filter = filter;

? ? ? ? ? ? watcher.Changed += new FileSystemEventHandler(OnProcess);

? ? ? ? ? ? watcher.Created += new FileSystemEventHandler(OnProcess);

? ? ? ? ? ? watcher.Deleted += new FileSystemEventHandler(OnProcess);

? ? ? ? ? ? watcher.Renamed += new RenamedEventHandler(OnRenamed);

? ? ? ? ? ? watcher.EnableRaisingEvents = true;

? ? ? ? ? ? watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size;

? ? ? ? ? ? watcher.IncludeSubdirectories = true;

? ? ? ? }

? ? ? ? private static void OnProcess(object source, FileSystemEventArgs e)

? ? ? ? {

? ? ? ? ? ? if (e.ChangeType == WatcherChangeTypes.Created)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? OnCreated(source, e);

? ? ? ? ? ? }

? ? ? ? ? ? else if (e.ChangeType == WatcherChangeTypes.Changed)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? OnChanged(source, e);

? ? ? ? ? ? }

? ? ? ? ? ? else if (e.ChangeType == WatcherChangeTypes.Deleted)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? OnDeleted(source, e);

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? private static void OnCreated(object source, FileSystemEventArgs e)

? ? ? ? {

? ? ? ? ? ? Console.WriteLine("文件新建事件處理邏輯 {0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);

? ? ? ? ? ? string file_name = System.IO.Path.GetFileName(e.FullPath);

? ? ? ? ? ? if(file_name==watch_create_file){

? ? ? ? ? ? ? ? restart();

? ? ? ? ? ? ? ? System.IO.File.Delete(e.FullPath);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? private static void OnChanged(object source, FileSystemEventArgs e)

? ? ? ? {

? ? ? ? ? ? Console.WriteLine("文件改變事件處理邏輯{0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);

? ? ? ? }

? ? ? ? private static void OnDeleted(object source, FileSystemEventArgs e)

? ? ? ? {

? ? ? ? ? ? Console.WriteLine("文件刪除事件處理邏輯{0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);

? ? ? ? }

? ? ? ? private static void OnRenamed(object source, RenamedEventArgs e)

? ? ? ? {

? ? ? ? ? ? Console.WriteLine("文件重命名事件處理邏輯{0}? {1}? {2}", e.ChangeType, e.FullPath, e.Name);

? ? ? ? }

? ? }

}



dog.json

{

? "file_path": "/data/wwwroot/xxxxxxx/",

? "command": "ps",

? "argument": " -aux",

? "find": "dotnet core_xxxxx.dll",

? "debug_file": "/root/dog/debug.txt",

? "command2":"nohup",

? "argument2":"/etc/init.d/dotnet_start.sh &",

? "watch_create_file":"restart.prop"

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末殊霞,一起剝皮案震驚了整個(gè)濱河市摧阅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绷蹲,老刑警劉巖棒卷,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異祝钢,居然都是意外死亡比规,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門拦英,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜒什,“玉大人,你說(shuō)我怎么就攤上這事龄章〕砸ィ” “怎么了乞封?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵做裙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我肃晚,道長(zhǎng)锚贱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任关串,我火速辦了婚禮拧廊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晋修。我一直安慰自己吧碾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布墓卦。 她就那樣靜靜地躺著倦春,像睡著了一般。 火紅的嫁衣襯著肌膚如雪落剪。 梳的紋絲不亂的頭發(fā)上睁本,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音忠怖,去河邊找鬼呢堰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凡泣,可吹牛的內(nèi)容都是我干的枉疼。 我是一名探鬼主播皮假,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骂维!你這毒婦竟也來(lái)了钞翔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤席舍,失蹤者是張志新(化名)和其女友劉穎布轿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體来颤,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汰扭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了福铅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萝毛。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滑黔,靈堂內(nèi)的尸體忽然破棺而出笆包,到底是詐尸還是另有隱情,我是刑警寧澤略荡,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布庵佣,位于F島的核電站,受9級(jí)特大地震影響汛兜,放射性物質(zhì)發(fā)生泄漏巴粪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一粥谬、第九天 我趴在偏房一處隱蔽的房頂上張望肛根。 院中可真熱鬧,春花似錦漏策、人聲如沸派哲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芭届。三九已至,卻和暖如春巢寡,著一層夾襖步出監(jiān)牢的瞬間喉脖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工抑月, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留树叽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓谦絮,卻偏偏與公主長(zhǎng)得像题诵,于是被迫代替她去往敵國(guó)和親洁仗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容