亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

利用C#編寫Linux守護進程實例代碼

2019-10-29 21:06:39
字體:
來源:轉載
供稿:網友

前言

Linux守護進程是Linux的后臺服務進程,相當于Windows服務,對于為Linux開發服務程序的朋友來說,Linux守護進程相關技術是必不可少的,因為這個技術不僅僅是為了開發守護進程,還可以拓展到多進程,父子進程文件描述符共享,父子進程通訊、控制等方面,是實現Linux大型服務的基礎技術之一。

如果要在Red Hat Enterprise Linux上將.NET Core進程作為后臺進程運行,則可以創建自定義systemd單元。今天我將為.NET Core編寫兩個自定義系統單元的例子。一個是運行.NET Core控制臺應用程序的一種類型,另一個是運行ASP.NET Core Web應用程序的簡單類型。

控制臺應用程序

建立一個應用程序

您可以用dotnet run在systemd中使用指定項目目錄作為工作目錄。但是,我們來構建一個二進制文件并將其用于systemd。用dotnet new 命令創建您的項目后編輯Program.cs如下。

using System;using System.IO;namespace ConsoleApplication{ public class Program {  public static void Main(string[] args)  {   var path = Path.GetTempFileName();   File.WriteAllText(path, "Hello Temp File!");   Console.WriteLine($"Wrote temp file: {path}");  } }}

然后用dotnet publish命令發布項目。你會看到bin/<Configuration>/<Framework>目錄下的二進制文件。

$ dotnet publish -c ReleasePublishing ConsoleApp for .NETCoreApp,Version=v1.1Project ConsoleApp (.NETCoreApp,Version=v1.1) was previously compiled. Skipping compilation.publish: Published to /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/ConsoleApp/bin/Release/netcoreapp1.1/publishPublished 1/1 projects successfully

創建一個自定義的systemd

首先,創建一個運行守護進程和工作目錄的用戶。

$ sudo useradd -s /sbin/nologin dotnetuser$ sudo mkdir /var/SystemdExample$ sudo cp /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/ConsoleApp/bin/Release/netcoreapp1.1/publish/* /var/SystemdExample$ sudo chown -R dotnetuser:dotnetuser /var/SystemdExample

然后在/etc/systemd/system/目錄下創建一個自定義的systemd單元文件。文件名應該是<unit-name>.<unit-type>。我創建的目錄和文件名為:/etc/systemd/system/netcore-console-example.service。

[Unit]Description=Example for .NET Core ConsoleApp with systemdDefaultDependencies=no [Service]Type=oneshotRemainAfterExit=noExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dllWorkingDirectory=/var/SystemdExampleUser=dotnetuserGroup=dotnetuser  [install]

您應該在ExecStart中指定dotnet的完整路徑。以上是紅帽提供的.NET Core 1.1的情況。然后你可以用systemctl命令執行守護進程。您可以使用systemctl status命令或journalctl命令查看控制臺輸出。

$ sudo systemctl start netcore-console-example.service$ sudo systemctl status netcore-console-example.service● netcore-console-example.service - Example for .NET Core ConsoleApp with systemd Loaded: loaded (/etc/systemd/system/netcore-console-example.service; enabled; vendor preset: disabled) Active: inactive (dead) since Fri 2017-02-24 00:29:16 JST; 13s ago Process: 18075 ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dll (code=exited, status=0/SUCCESS) Main PID: 18075 (code=exited, status=0/SUCCESS) Feb 24 00:29:16 localhost.localdomain systemd[1]: Starting Example for .NET Core ConsoleApp with systemd...Feb 24 00:29:16 localhost.localdomain dotnet[18075]: Wrote temp file: /tmp/tmph1ok6H.tmpFeb 24 00:29:16 localhost.localdomain systemd[1]: Started Example for .NET Core ConsoleApp with systemd. $ journalctl -u netcore-console-example.service -eFeb 24 00:29:16 localhost.localdomain systemd[1]: Starting Example for .NET Core ConsoleApp with systemd...Feb 24 00:29:16 localhost.localdomain dotnet[18075]: Wrote temp file: /tmp/tmph1ok6H.tmpFeb 24 00:29:16 localhost.localdomain systemd[1]: Started Example for .NET Core ConsoleApp with systemd.$ sudo cat /tmp/tmph1ok6H.tmpHello Temp File!

使用PrivateTemp

在上述系統單元中,程序在臨時文件夾下寫入一個文件。你有時想寫一個來自其他用戶的臨時文件是安全的。您可以在[Service]section中的指定使用PrivateTemp。

[Service]Type=oneshotRemainAfterExit=noExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dllWorkingDirectory=/var/SystemdExampleUser=dotnetuserGroup=dotnetuserPrivateTemp=true

重新加載單元文件后,程序可以像前一樣訪問/tmp目錄,但這不是實際的/tmp目錄。

$ sudo systemctl daemon-reload $ sudo systemctl start netcore-console-example.service$ sudo systemctl status netcore-console-example.service● netcore-console-example.service - Example for .NET Core ConsoleApp with systemd Loaded: loaded (/etc/systemd/system/netcore-console-example.service; enabled; vendor preset: disabled) Active: inactive (dead) since Fri 2017-02-24 00:35:46 JST; 12s ago Process: 18415 ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dll (code=exited, status=0/SUCCESS) Main PID: 18415 (code=exited, status=0/SUCCESS) Feb 24 00:35:46 localhost.localdomain systemd[1]: Starting Example for .NET Core ConsoleApp with systemd...Feb 24 00:35:46 localhost.localdomain dotnet[18415]: Wrote temp file: /tmp/tmpJLWAGC.tmpFeb 24 00:35:46 localhost.localdomain systemd[1]: Started Example for .NET Core ConsoleApp with systemd.$ ls /tmp/tmpJLWAGC.tmpls: cannot access /tmp/tmpJLWAGC.tmp: No such file or directory

Web應用程序

建立一個應用程序

現在我們來構建一個ASP.NET Core Web應用程序。今天我使用默認的模板項目。

$ dotnet new -t webCreated new C# project in /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/WebApp.$ dotnet restore ** snipped**log : Restore completed in 9721ms.$ dotnet publish -c ReleasePublishing WebApp for .NETCoreApp,Version=v1.1** snipped **publish: Published to /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/WebApp/bin/Release/netcoreapp1.1/publishPublished 1/1 projects successfully

現在可以用dotnet命令運行。

$ dotnet bin/Release/netcoreapp1.1/publish/WebApp.dll info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]  User profile is available. Using '/home/tatanaka/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.Hosting environment: ProductionContent root path: /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/WebAppNow listening on: http://localhost:5000Application started. Press Ctrl+C to shut down.

創建一個自定義的systemd

為這個Web應用程序也指定dotnetuser名稱。

$ sudo mkdir /var/SystemdExample$ sudo cp -R bin/Release/netcoreapp1.1/publish/* /var/SystemdWebExample$ sudo chown -R dotnetuser:dotnetuser /var/SystemdWebExample

然后創建一個自定義的systemd單元文件/etc/systemd/system/netcore-web-example.service。

[Unit]Description=Example for .NET Core WebApp with systemdDefaultDependencies=noWants=network.target # network is requiredAfter=network.target [Service]ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet WebApp.dllWorkingDirectory=/var/SystemdWebExampleRestart=alwaysRestartSec=10 # Restart service after 10 seconds if dotnet service crashesSyslogIdentifier=dotnet-exampleUser=dotnetuserGroup=dotnetuserPrivateTmp=trueEnvironment=ASPNETCORE_ENVIRONMENT=Production # specify environment variable for environmentEnvironment=ASPNETCORE_URLS=http://*:8080 # specify environement variable for listening port [Install]WantedBy = multi-user.target

最后,您可以將ASP.NET Core應用程序作為Linux守護程序運行。請注意,此應用程序偵聽端口8080代替了ASP.NET Core 默認的 5000,因為我在ASPNETCORE_URLS單元文件中指定了環境變量  。

$ systemctl start netcore-web-example.service[tatanaka@localhost WebApp]$ systemc^C[tatanaka@localhost WebApp]$ sudo systemctl status netcore-web-example.service[sudo] password for tatanaka: ● netcore-web-example.service - Example for .NET Core WebApp with systemd Loaded: loaded (/etc/systemd/system/netcore-web-example.service; disabled; vendor preset: disabled) Active: active (running) since Sat 2017-02-25 01:02:12 JST; 11s ago Main PID: 7041 (dotnet) CGroup: /system.slice/netcore-web-example.service   └─7041 /opt/rh/rh-dotnetcore11/root/usr/bin/dotnet WebApp.dll Feb 25 01:02:12 localhost.localdomain systemd[1]: Started Example for .NET Core WebApp with systemd.Feb 25 01:02:12 localhost.localdomain systemd[1]: Starting Example for .NET Core WebApp with systemd...Feb 25 01:02:12 localhost.localdomain dotnet-example[7041]: info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]Feb 25 01:02:12 localhost.localdomain dotnet-example[7041]: User profile is available. Using '/home/dotnetuser/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.Feb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Hosting environment: ProductionFeb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Content root path: /var/SystemdWebExampleFeb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Now listening on: http://*:8080Feb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Application started. Press Ctrl+C to shut down. $ journalctl -u netcore-web-example -xf-- Logs begin at Mon 2017-02-20 11:58:31 JST. --Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[2]Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Sending file. Request path: '/images/banner4.svg'. Physical path: '/var/SystemdWebExample/wwwroot/images/banner4.svg'Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Request finished in 0.1973ms 200 image/svg+xmlFeb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Request starting HTTP/1.1 GET http://localhost:8080/favicon.icoFeb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[2]Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Sending file. Request path: '/favicon.ico'. Physical path: '/var/SystemdWebExample/wwwroot/favicon.ico'Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Request finished in 0.5824ms 200 image/x-icon

然而這對于ASP.NET Core的生產使用來說是不夠的。你可能需要設置一個反向代理服務器,比如Jexus,nginx,防火墻等等。

Writing a Linux daemon in C#

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品日本亚洲专区61| 日韩中文字幕在线免费观看| 亚洲精品久久久久久久久久久久久| 亚洲精品永久免费| 亚洲日韩欧美视频一区| www.日本久久久久com.| 国产精品亚洲一区二区三区| 亚洲老司机av| 992tv成人免费影院| 久久久久久久香蕉网| 欧美一级片久久久久久久| 亚洲人午夜精品免费| 最近2019年中文视频免费在线观看| 国产在线一区二区三区| 亚洲韩国欧洲国产日产av| 亚洲视频在线观看视频| 国产视频自拍一区| 亚洲黄色在线看| 日韩在线观看免费高清| 国产91精品久久久久久| 欧美性黄网官网| 日韩在线精品视频| 亚洲 日韩 国产第一| 欧美老少做受xxxx高潮| 91国在线精品国内播放| 国产+人+亚洲| www.欧美精品| 欧美成aaa人片免费看| 国产91精品久久久久| 中文字幕av一区中文字幕天堂| 亚洲国产精彩中文乱码av在线播放| 岛国视频午夜一区免费在线观看| 91久久精品美女高潮| 亚洲第一网站男人都懂| 国产主播在线一区| 日韩欧美精品中文字幕| 亚洲a中文字幕| 欧美成人精品在线| 国产中文欧美精品| 永久555www成人免费| 播播国产欧美激情| 亚洲自拍另类欧美丝袜| 日韩精品久久久久久福利| 91精品久久久久久综合乱菊| 亚洲最大中文字幕| 欧美激情网站在线观看| 美日韩精品视频免费看| 日韩av一卡二卡| 国产精品福利无圣光在线一区| 欧美亚洲免费电影| 午夜精品久久久久久久久久久久| 日韩免费视频在线观看| 亚洲伊人成综合成人网| 日韩美女激情视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲bt欧美bt日本bt| 成人欧美一区二区三区在线| 国产一区欧美二区三区| 黄色成人av网| 亚洲女人被黑人巨大进入| 欧美在线激情视频| 亚洲开心激情网| 亚洲欧洲国产伦综合| 久久免费成人精品视频| 在线亚洲午夜片av大片| 国内精品在线一区| 韩国日本不卡在线| 日韩网站免费观看| 国产成人精品免高潮费视频| 欧美大秀在线观看| 国内精品视频久久| 欧美激情精品久久久久久大尺度| 欧美激情一级精品国产| 欧美诱惑福利视频| 欧美剧在线观看| 久久久亚洲影院| 亚洲色图狂野欧美| 国产精品扒开腿爽爽爽视频| 国产综合香蕉五月婷在线| 久久久国产视频| 777777777亚洲妇女| 日韩经典一区二区三区| 国产精品美女www爽爽爽视频| 久久视频在线观看免费| 高清欧美性猛交xxxx| 日韩一级黄色av| 色婷婷久久一区二区| 欧美成人小视频| 一区三区二区视频| 伊人久久大香线蕉av一区二区| 亚洲第一av网站| 亚洲男人天堂2019| 91产国在线观看动作片喷水| 亚洲欧洲一区二区三区久久| 欧美电影在线免费观看网站| 精品国产精品三级精品av网址| 欧美日韩一区二区三区在线免费观看| 国产精品天天狠天天看| 欧美一级电影久久| 亚洲天堂一区二区三区| 成人性生交大片免费看小说| 日韩在线免费高清视频| 久久精视频免费在线久久完整在线看| 国产美女精品免费电影| 亚洲自拍小视频免费观看| 久久久精品中文字幕| 欧美极品美女电影一区| 亚洲精品黄网在线观看| 欧美在线视频一二三| 成人网欧美在线视频| 国产精品69久久久久| 一区二区三区黄色| 亚洲最新在线视频| 国产精品久久97| 深夜福利日韩在线看| 亚洲性无码av在线| 91福利视频在线观看| 久久视频在线看| 麻豆乱码国产一区二区三区| 国产精品影片在线观看| 午夜精品久久久久久久99黑人| 亚洲人成网站999久久久综合| 一区二区三区无码高清视频| 免费不卡在线观看av| 日本亚洲欧美三级| 一本色道久久88精品综合| 久久夜色精品国产亚洲aⅴ| 久久久www成人免费精品| 欧美电影免费播放| 精品国偷自产在线视频99| 久久久久久国产免费| 久久免费观看视频| 亚洲免费av电影| 日韩在线视频导航| 成人淫片在线看| 国产一区二区日韩精品欧美精品| 亚洲精品中文字幕有码专区| 精品亚洲精品福利线在观看| 成人激情视频免费在线| 亚洲精品98久久久久久中文字幕| 精品久久久久久久久久| 亚洲天堂av在线播放| 97视频在线免费观看| 欧美日韩美女在线| 欧美大尺度电影在线观看| 8050国产精品久久久久久| 一本色道久久88精品综合| 欧美精品在线免费观看| 国产99久久精品一区二区| 久久久久久久久91| 亚洲国产精品久久久久| 亚洲一区国产精品| 国产午夜精品全部视频在线播放| 97久久超碰福利国产精品…| 国产精品视频男人的天堂| 九九热这里只有精品6| 奇米四色中文综合久久| 国产精品日韩电影| 尤物yw午夜国产精品视频明星| 色播久久人人爽人人爽人人片视av| 亚洲人免费视频| 97成人超碰免| 日韩成人在线视频网站| 91精品视频网站|