%3C%21DOCTYPE%20html%3E%0A%3Chtml%3E%0A%3Chead%3E%0A%3Cmeta%20charset%3D%22UTF-8%22%3E%0A%3Cstyle%3E%0Abody%7Bfont-family%3A-apple-system%2CBlinkMacSystemFont%2C%22Segoe%20UI%22%2CHelvetica%2CArial%2Csans-serif%3Bline-height%3A1.8%3Bmax-width%3A900px%3Bmargin%3A0%20auto%3Bpadding%3A20px%3Bcolor%3A%2324292e%7D%0Ah1%7Bcolor%3A%231a1a2e%3Bborder-bottom%3A2px%20solid%20%23e94560%3Bpadding-bottom%3A10px%7D%0Ah2%7Bcolor%3A%2316213e%3Bmargin-top%3A40px%3Bborder-bottom%3A1px%20solid%20%23ddd%3Bpadding-bottom%3A6px%7D%0Ah3%7Bcolor%3A%230f3460%3Bmargin-top%3A30px%7D%0Acode%7Bbackground%3A%23f6f8fa%3Bpadding%3A2px%206px%3Bborder-radius%3A3px%3Bfont-size%3A0.9em%7D%0Apre%7Bbackground%3A%232d2d2d%3Bcolor%3A%23f8f8f2%3Bpadding%3A16px%3Bborder-radius%3A6px%3Boverflow-x%3Aauto%3Bline-height%3A1.5%7D%0Apre%20code%7Bbackground%3Atransparent%3Bcolor%3Ainherit%3Bpadding%3A0%7D%0Atable%7Bborder-collapse%3Acollapse%3Bwidth%3A100%25%3Bmargin%3A16px%200%7D%0Ath%2Ctd%7Bborder%3A1px%20solid%20%23dfe2e5%3Bpadding%3A8px%2012px%3Btext-align%3Aleft%7D%0Ath%7Bbackground%3A%23f6f8f8%3Bfont-weight%3A600%7D%0Ablockquote%7Bborder-left%3A4px%20solid%20%23e94560%3Bmargin%3A16px%200%3Bpadding%3A8px%2016px%3Bbackground%3A%23f8f9fa%7D%0Astrong%7Bcolor%3A%231a1a2e%7D%0Ablockquote%20p%7Bmargin%3A0%7D%0Aul%2Col%7Bpadding-left%3A24px%7D%0Ali%7Bmargin-bottom%3A4px%7D%0Aa%7Bcolor%3A%230366d6%3Btext-decoration%3Anone%7D%0A%3C/style%3E%0A%3C/head%3E%0A%3Cbody%3E%3Ch1%20id%3D%22linux-systemd%22%3ELinux%20systemd%20%E6%B7%B1%E5%BA%A6%E5%B7%A5%E7%A8%8B%E5%AE%9E%E6%88%98%EF%BC%9A%E4%BB%8E%E6%9C%8D%E5%8A%A1%E7%AE%A1%E7%90%86%E5%88%B0%E5%AE%89%E5%85%A8%E6%B2%99%E7%AE%B1%E4%B8%8E%E8%B5%84%E6%BA%90%E7%AE%A1%E6%8E%A7%3C/h1%3E%0A%3Cblockquote%3E%0A%3Cp%3Esystemd%20%E6%97%A9%E5%B7%B2%E8%B6%85%E8%B6%8A%E4%BC%A0%E7%BB%9F%20init%20%E8%BF%9B%E7%A8%8B%E7%9A%84%E8%8C%83%E7%95%B4%EF%BC%8C%E6%88%90%E4%B8%BA%E7%8E%B0%E4%BB%A3%20Linux%20%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%A0%B8%E5%BF%83%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E5%B1%82%E3%80%82%E6%9C%AC%E6%96%87%E5%B0%86%E4%BB%8E%E6%9E%B6%E6%9E%84%E5%8E%9F%E7%90%86%E5%88%B0%E7%94%9F%E4%BA%A7%E5%AE%9E%E8%B7%B5%EF%BC%8C%E6%B7%B1%E5%85%A5%E5%89%96%E6%9E%90%20systemd%20%E7%9A%84%E9%AB%98%E7%BA%A7%E5%B7%A5%E7%A8%8B%E8%83%BD%E5%8A%9B%E2%80%94%E2%80%94%E6%9C%8D%E5%8A%A1%E4%BE%9D%E8%B5%96%E7%BC%96%E6%8E%92%E3%80%81%E5%AE%89%E5%85%A8%E6%B2%99%E7%AE%B1%E5%8A%A0%E5%9B%BA%E3%80%81%E8%B5%84%E6%BA%90%E7%AE%A1%E6%8E%A7%E4%B8%8E%E8%B0%83%E5%BA%A6%E8%87%AA%E5%8A%A8%E5%8C%96%EF%BC%8C%E5%B9%B6%E9%99%84%E5%B8%A6%E5%AE%8C%E6%95%B4%20Rust%20%E5%B7%A5%E5%85%B7%E9%93%BE%E5%AE%9E%E7%8E%B0%E3%80%82%3C/p%3E%0A%3C/blockquote%3E%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22systemd%22%3E%E4%B8%80%E3%80%81systemd%20%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B%E4%B8%8E%E8%AE%BE%E8%AE%A1%E5%93%B2%E5%AD%A6%3C/h2%3E%0A%3Ch3%20id%3D%2211-sysv-init%22%3E1.1%20%E4%BC%A0%E7%BB%9F%20SysV%20init%20%E7%9A%84%E6%A0%B9%E6%9C%AC%E6%80%A7%E7%BC%BA%E9%99%B7%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3E%E5%90%AF%E5%8A%A8%E9%A1%BA%E5%BA%8F%EF%BC%9A%E4%B8%B2%E8%A1%8C%E6%89%A7%E8%A1%8C%20/etc/init.d/%20%E8%84%9A%E6%9C%AC%20%E2%86%92%20%E5%90%AF%E5%8A%A8%E6%85%A2%E3%80%81%E4%BE%9D%E8%B5%96%E9%9A%BE%E4%BB%A5%E8%A1%A8%E8%BE%BE%E3%80%81%E8%B6%85%E6%97%B6%E6%97%A0%E5%AE%88%E6%8A%A4%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3Esystemd%20%E9%80%9A%E8%BF%87%E4%BB%A5%E4%B8%8B%E8%AE%BE%E8%AE%A1%E8%A7%A3%E5%86%B3%E8%BF%99%E4%BA%9B%E9%97%AE%E9%A2%98%EF%BC%9A%3C/p%3E%0A%3Cul%3E%0A%3Cli%3E%3Cstrong%3ESocket-based%20Activation%3C/strong%3E%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%9C%A8%E9%A6%96%E6%AC%A1%E8%AF%B7%E6%B1%82%E5%88%B0%E8%BE%BE%E5%89%8D%E4%B8%8D%E5%90%AF%E5%8A%A8%EF%BC%8C%E9%9B%B6%E5%BB%B6%E8%BF%9F%E5%8D%A0%E7%94%A8%3C/li%3E%0A%3Cli%3E%3Cstrong%3EParallel%20Startup%3C/strong%3E%EF%BC%9A%E5%9F%BA%E4%BA%8E%E4%BE%9D%E8%B5%96%E5%9B%BE%EF%BC%88Unit%20Dependencies%EF%BC%89%E7%9A%84%E5%B9%B6%E8%A1%8C%E5%90%AF%E5%8A%A8%3C/li%3E%0A%3Cli%3E%3Cstrong%3EDeclarative%20Configuration%3C/strong%3E%EF%BC%9A%E5%A3%B0%E6%98%8E%E5%BC%8F%20unit%20%E6%96%87%E4%BB%B6%E6%9B%BF%E4%BB%A3%E8%84%9A%E6%9C%AC%3C/li%3E%0A%3Cli%3E%3Cstrong%3EAggressive%20Process%20Management%3C/strong%3E%EF%BC%9A%E8%BF%9B%E7%A8%8B%E5%B4%A9%E6%BA%83%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF%E3%80%81%E7%9C%8B%E9%97%A8%E7%8B%97%E6%9C%BA%E5%88%B6%3C/li%3E%0A%3C/ul%3E%0A%3Ch3%20id%3D%2212-unit%22%3E1.2%20Unit%20%E7%B1%BB%E5%9E%8B%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3E%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%E2%94%82%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20systemd%20Unit%20%E7%B1%BB%E5%9E%8B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%9C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%AC%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%A4%0A%E2%94%82%20.service%20%20%20%20%20%E2%94%82%20%E6%9C%8D%E5%8A%A1%E5%8D%95%E5%85%83%EF%BC%8C%E6%8F%8F%E8%BF%B0%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.socket%20%20%20%20%20%20%E2%94%82%20socket%20%E6%BF%80%E6%B4%BB%E5%8D%95%E5%85%83%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.timer%20%20%20%20%20%20%20%E2%94%82%20%E5%AE%9A%E6%97%B6%E5%99%A8%E5%8D%95%E5%85%83%EF%BC%8C%E6%9B%BF%E4%BB%A3%20cron%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.mount%20%20%20%20%20%20%20%E2%94%82%20%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%8C%82%E8%BD%BD%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.automount%20%20%20%E2%94%82%20%E6%8C%89%E9%9C%80%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.path%20%20%20%20%20%20%20%20%E2%94%82%20%E8%B7%AF%E5%BE%84%E7%9B%91%E6%8E%A7%E8%A7%A6%E5%8F%91%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.slice%20%20%20%20%20%20%20%E2%94%82%20%E8%B5%84%E6%BA%90%E7%AE%A1%E6%8E%A7%E5%88%87%E7%89%87%EF%BC%88cgroups%20%E5%B1%82%E7%BA%A7%EF%BC%89%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.target%20%20%20%20%20%20%E2%94%82%20%E7%9B%AE%E6%A0%87%E5%8D%95%E5%85%83%EF%BC%8C%E6%A8%A1%E6%8B%9F%E8%BF%90%E8%A1%8C%E7%BA%A7%E5%88%AB%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20.swap%20%20%20%20%20%20%20%20%E2%94%82%20swap%20%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%86%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%B4%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2213-unit-section%22%3E1.3%20Unit%20%E6%96%87%E4%BB%B6%E6%A0%B8%E5%BF%83%E6%AE%B5%EF%BC%88Section%EF%BC%89%E7%BB%93%E6%9E%84%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%5BUnit%5D%0ADescription%3Dmy-service%0AAfter%3Dnetwork.target%20postgresql.service%0ARequires%3Dpostgresql.service%0AWants%3Dredis.service%0A%0A%5BService%5D%0AType%3Dnotify%0AExecStart%3D/usr/local/bin/my-service%0AExecReload%3D/bin/kill%20-HUP%20%24MAINPID%0ARestart%3Don-failure%0ARestartSec%3D5%0A%0A%5BInstall%5D%0AWantedBy%3Dmulti-user.target%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22_1%22%3E%E4%BA%8C%E3%80%81%E9%AB%98%E7%BA%A7%E6%9C%8D%E5%8A%A1%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86%E4%B8%8E%E6%9C%8D%E5%8A%A1%E7%BC%96%E6%8E%92%3C/h2%3E%0A%3Ch3%20id%3D%2221%22%3E2.1%20%E4%BE%9D%E8%B5%96%E7%B1%BB%E5%9E%8B%E7%B2%BE%E7%A1%AE%E7%90%86%E8%A7%A3%3C/h3%3E%0A%3Ctable%3E%0A%3Cthead%3E%0A%3Ctr%3E%0A%3Cth%3E%E6%8C%87%E4%BB%A4%3C/th%3E%0A%3Cth%3E%E8%AF%AD%E4%B9%89%3C/th%3E%0A%3Cth%3E%E8%A1%8C%E4%B8%BA%3C/th%3E%0A%3C/tr%3E%0A%3C/thead%3E%0A%3Ctbody%3E%0A%3Ctr%3E%0A%3Ctd%3E%3Cstrong%3ERequires%3C/strong%3E%3C/td%3E%0A%3Ctd%3E%E5%BC%BA%E4%BE%9D%E8%B5%96%3C/td%3E%0A%3Ctd%3E%E4%BE%9D%E8%B5%96%E5%8D%95%E5%85%83%E5%A4%B1%E8%B4%A5%E5%88%99%E6%9C%AC%E5%8D%95%E5%85%83%E5%81%9C%E6%AD%A2%3C/td%3E%0A%3C/tr%3E%0A%3Ctr%3E%0A%3Ctd%3E%3Cstrong%3EWants%3C/strong%3E%3C/td%3E%0A%3Ctd%3E%E5%BC%B1%E6%8E%A8%E8%8D%90%3C/td%3E%0A%3Ctd%3E%E4%BE%9D%E8%B5%96%E5%8D%95%E5%85%83%E5%A4%B1%E8%B4%A5%E4%B8%8D%E5%BD%B1%E5%93%8D%E6%9C%AC%E5%8D%95%E5%85%83%3C/td%3E%0A%3C/tr%3E%0A%3Ctr%3E%0A%3Ctd%3E%3Cstrong%3EBindsTo%3C/strong%3E%3C/td%3E%0A%3Ctd%3E%E7%BB%91%E5%AE%9A%E4%BE%9D%E8%B5%96%3C/td%3E%0A%3Ctd%3E%E4%BE%9D%E8%B5%96%E5%8D%95%E5%85%83%E5%81%9C%E6%AD%A2%E5%88%99%E6%9C%AC%E5%8D%95%E5%85%83%E5%81%9C%E6%AD%A2%3C/td%3E%0A%3C/tr%3E%0A%3Ctr%3E%0A%3Ctd%3E%3Cstrong%3EAfter/Before%3C/strong%3E%3C/td%3E%0A%3Ctd%3E%E9%A1%BA%E5%BA%8F%E7%BA%A6%E6%9D%9F%3C/td%3E%0A%3Ctd%3E%E4%BB%85%E6%8E%A7%E5%88%B6%E5%90%AF%E5%8A%A8%E9%A1%BA%E5%BA%8F%EF%BC%8C%E4%B8%8D%E6%9E%84%E6%88%90%E4%BE%9D%E8%B5%96%3C/td%3E%0A%3C/tr%3E%0A%3C/tbody%3E%0A%3C/table%3E%0A%3Ch3%20id%3D%2222%22%3E2.2%20%E5%A4%8D%E6%9D%82%E4%BE%9D%E8%B5%96%E5%9B%BE%E5%AE%9E%E6%88%98%EF%BC%9A%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%90%AF%E5%8A%A8%E9%A1%BA%E5%BA%8F%E7%BC%96%E6%8E%92%3C/h3%3E%0A%3Cp%3E%E8%80%83%E8%99%91%E4%B8%80%E4%B8%AA%E5%85%B8%E5%9E%8B%E7%9A%84%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%BA%94%E7%94%A8%EF%BC%9A%3C/p%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3Eapp.service%20%28%E4%B8%9A%E5%8A%A1%E6%9C%8D%E5%8A%A1%29%0A%20%20%E2%86%93%20After%2BRequires%0Aredis.service%20%28%E7%BC%93%E5%AD%98%29%0A%20%20%E2%86%93%20After%2BRequires%20%20%0Apostgresql.service%20%28%E6%95%B0%E6%8D%AE%E5%BA%93%29%0A%20%20%E2%86%93%20After%0Anetwork-online.target%20%28%E7%BD%91%E7%BB%9C%E5%B0%B1%E7%BB%AA%29%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%3Cstrong%3E%E5%85%B3%E9%94%AE%E6%8A%80%E5%B7%A7%EF%BC%9A%3C/strong%3E%20%E4%BD%BF%E7%94%A8%20%3Ccode%3EAfter%3C/code%3E%20%E7%A1%AE%E4%BF%9D%E9%A1%BA%E5%BA%8F%E4%BD%86%E4%B8%8D%E5%BC%BA%E5%88%B6%E4%BE%9D%E8%B5%96%EF%BC%8C%E7%BB%84%E5%90%88%20%3Ccode%3ERequires%3C/code%3E%20%E8%A1%A8%E8%BE%BE%E5%BC%BA%E4%BE%9D%E8%B5%96%E3%80%82%3C/p%3E%0A%3Ch3%20id%3D%2223-target%22%3E2.3%20%E8%87%AA%E5%AE%9A%E4%B9%89%20target%20%E7%BC%96%E6%8E%92%E5%90%AF%E5%8A%A8%E9%98%B6%E6%AE%B5%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/system/myapp.target%0A%5BUnit%5D%0ADescription%3DMy%20Application%20Stack%0ARequires%3Dmyapp-db.service%20myapp-cache.service%20myapp-api.service%0AAfter%3Dmyapp-db.service%20myapp-cache.service%20myapp-api.service%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-bash%22%3E%23%20%E5%90%AF%E5%8A%A8%E6%95%B4%E4%B8%AA%E5%BA%94%E7%94%A8%E6%A0%88%0Asystemctl%20start%20myapp.target%0A%23%20%E6%9F%A5%E7%9C%8B%E6%9C%8D%E5%8A%A1%E7%8A%B6%E6%80%81%E6%A0%91%0Asystemctl%20list-dependencies%20myapp.target%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2224-type%22%3E2.4%20Type%20%E7%B1%BB%E5%9E%8B%E4%B8%8E%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20%E9%80%82%E7%94%A8%E4%BA%8E%E4%BC%9A%20daemonize%20%E7%9A%84%E4%BC%A0%E7%BB%9F%E6%9C%8D%E5%8A%A1%EF%BC%88%E4%B8%8D%E6%8E%A8%E8%8D%90%EF%BC%8C%E9%9C%80%E8%A6%81%20PIDFile%EF%BC%89%0AType%3Dforking%0A%0A%23%20%E9%80%82%E7%94%A8%E4%BA%8E%E5%89%8D%E5%8F%B0%E8%BF%90%E8%A1%8C%E7%9A%84%E7%8E%B0%E4%BB%A3%E6%9C%8D%E5%8A%A1%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%89%0AType%3Dsimple%0A%0A%23%20%E9%80%82%E7%94%A8%E4%BA%8E%20systemd%20%E5%90%AF%E5%8A%A8%E5%90%8E%E7%AB%8B%E5%8D%B3%E9%80%80%E5%87%BA%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E8%84%9A%E6%9C%AC%0AType%3Doneshot%0A%0A%23%20%E9%80%82%E7%94%A8%E4%BA%8E%E9%9C%80%E8%A6%81%20sd_notify%20%E9%80%9A%E7%9F%A5%E5%90%AF%E5%8A%A8%E5%AE%8C%E6%88%90%E7%9A%84%E6%9C%8D%E5%8A%A1%EF%BC%88%E9%AB%98%E7%BA%A7%EF%BC%89%0AType%3Dnotify%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22socket-activation%22%3E%E4%B8%89%E3%80%81Socket%20Activation%EF%BC%9A%E6%8C%89%E9%9C%80%E5%90%AF%E5%8A%A8%E4%B8%8E%E9%9B%B6%E5%BB%B6%E8%BF%9F%3C/h2%3E%0A%3Ch3%20id%3D%2231%22%3E3.1%20%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%3C/h3%3E%0A%3Cp%3ESocket%20Activation%20%E5%85%81%E8%AE%B8%20systemd%20%E5%85%88%E5%88%9B%E5%BB%BA%E5%B9%B6%E7%9B%91%E5%90%AC%20socket%EF%BC%8C%E5%BD%93%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%BE%BE%E6%97%B6%E5%86%8D%E5%90%AF%E5%8A%A8%E5%AF%B9%E5%BA%94%E6%9C%8D%E5%8A%A1%E3%80%82%E8%BF%99%E5%B8%A6%E6%9D%A5%E4%B8%89%E5%A4%A7%E4%BC%98%E5%8A%BF%EF%BC%9A%3C/p%3E%0A%3Col%3E%0A%3Cli%3E%3Cstrong%3E%E5%B9%B6%E8%A1%8C%E5%88%9D%E5%A7%8B%E5%8C%96%3C/strong%3E%EF%BC%9Asocket%20%E5%88%9B%E5%BB%BA%E6%97%A0%E9%9C%80%E7%AD%89%E5%BE%85%E6%9C%8D%E5%8A%A1%E5%90%AF%E5%8A%A8%3C/li%3E%0A%3Cli%3E%3Cstrong%3E%E9%9B%B6%E5%90%AF%E5%8A%A8%E5%BB%B6%E8%BF%9F%3C/strong%3E%EF%BC%9A%E7%AC%AC%E4%B8%80%E4%B8%AA%E8%BF%9E%E6%8E%A5%E6%97%B6%E6%9C%8D%E5%8A%A1%E6%89%8D%E5%90%AF%E5%8A%A8%E5%B9%B6%E5%AE%8C%E6%88%90%E5%88%9D%E5%A7%8B%E5%8C%96%3C/li%3E%0A%3Cli%3E%3Cstrong%3E%E8%B5%84%E6%BA%90%E8%8A%82%E7%BA%A6%3C/strong%3E%EF%BC%9A%E6%97%A0%E8%AF%B7%E6%B1%82%E6%97%B6%E4%B8%8D%E6%B6%88%E8%80%97%E5%86%85%E5%AD%98%3C/li%3E%0A%3C/ol%3E%0A%3Ch3%20id%3D%2232-rust-socket-activation%22%3E3.2%20Rust%20%E5%AE%9E%E7%8E%B0%20Socket%20Activation%20%E6%9C%8D%E5%8A%A1%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-rust%22%3E//%20socket_activation_service.rs%0Ause%20std%3A%3Aos%3A%3Aunix%3A%3Anet%3A%3AUnixListener%3B%0Ause%20std%3A%3Aos%3A%3Afd%3A%3AFromRawFd%3B%0Ause%20nix%3A%3Asys%3A%3Asocket%3A%3A%7Bgetsockname%2C%20SockaddrLike%7D%3B%0Ause%20systemd%3A%3Adaemon%3A%3A%7Blisten_fds%2C%20LISTEN_PID%2C%20LISTEN_FDS%2C%20LISTEN_FDNAMES%7D%3B%0A%0Afn%20get_systemd_socket%28%29%20-%26gt%3B%20Option%26lt%3BUnixListener%26gt%3B%20%7B%0A%20%20%20%20let%20fds%20%3D%20listen_fds%28false%29.ok%28%29%3F%3B%0A%20%20%20%20if%20fds.is_empty%28%29%20%7B%0A%20%20%20%20%20%20%20%20return%20None%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20//%20LISTEN_FDS%20%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%BC%A0%E9%80%92%E4%BA%86%20systemd%20%E5%88%86%E9%85%8D%E7%9A%84%20fd%20%E6%95%B0%E9%87%8F%0A%20%20%20%20//%20fd%20%E7%BC%96%E5%8F%B7%E4%BB%8E%20SD_LISTEN_FDS_START%20%283%29%20%E5%BC%80%E5%A7%8B%0A%20%20%20%20let%20fd%20%3D%20unsafe%20%7B%0A%20%20%20%20%20%20%20%20UnixListener%3A%3Afrom_raw_fd%283%29%20//%20SD_LISTEN_FDS_START%20%3D%203%0A%20%20%20%20%7D%3B%0A%20%20%20%20Some%28fd%29%0A%7D%0A%0Afn%20main%28%29%20%7B%0A%20%20%20%20env_logger%3A%3Ainit%28%29%3B%0A%0A%20%20%20%20let%20listener%20%3D%20get_systemd_socket%28%29%0A%20%20%20%20%20%20%20%20.unwrap_or_else%28%7C%7C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%E9%9D%9E%20systemd%20%E5%90%AF%E5%8A%A8%E6%97%B6%E4%BD%BF%E7%94%A8%E9%BB%98%E8%AE%A4%20socket%0A%20%20%20%20%20%20%20%20%20%20%20%20UnixListener%3A%3Arun%28%26quot%3B/run/myapp.sock%26quot%3B%29.expect%28%26quot%3BFailed%20to%20bind%20socket%26quot%3B%29%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20//%20%E9%80%9A%E7%9F%A5%20systemd%20%E6%9C%8D%E5%8A%A1%E5%B7%B2%E5%B0%B1%E7%BB%AA%EF%BC%88%E9%9C%80%E8%A6%81%E5%B0%86%20Type%20%E8%AE%BE%E4%B8%BA%20notify%EF%BC%89%0A%20%20%20%20systemd%3A%3Adaemon%3A%3Anotify%28false%2C%20%26amp%3B%5Bdaemon%3A%3ANotifyState%3A%3AReady%5D%29%0A%20%20%20%20%20%20%20%20.expect%28%26quot%3BFailed%20to%20notify%20systemd%26quot%3B%29%3B%0A%0A%20%20%20%20for%20stream%20in%20listener.incoming%28%29%20%7B%0A%20%20%20%20%20%20%20%20match%20stream%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Ok%28stream%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20handle_client%28stream%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20Err%28e%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20log%3A%3Aerror%21%28%26quot%3BConnection%20failed%3A%20%7B%7D%26quot%3B%2C%20e%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20handle_client%28mut%20stream%3A%20UnixStream%29%20%7B%0A%20%20%20%20//%20%E5%A4%84%E7%90%86%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AF%B7%E6%B1%82%0A%20%20%20%20let%20mut%20buf%20%3D%20%5B0u8%3B%201024%5D%3B%0A%20%20%20%20stream.read%28%26amp%3Bmut%20buf%29.ok%28%29%3B%0A%20%20%20%20stream.write%28b%26quot%3BHTTP/1.1%20200%20OK%5Cr%5CnContent-Length%3A%202%5Cr%5Cn%5Cr%5CnOK%26quot%3B%29.ok%28%29%3B%0A%7D%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2233-socket-unit%22%3E3.3%20%E5%AF%B9%E5%BA%94%20Socket%20Unit%20%E9%85%8D%E7%BD%AE%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/system/myapp.socket%0A%5BUnit%5D%0ADescription%3DMyApp%20Socket%0ABefore%3Dmyapp.service%0A%0A%5BSocket%5D%0AListenStream%3D/run/myapp.sock%0ASocketMode%3D0660%0ASocketUser%3Dapp%0ASocketGroup%3Dapp%0A%0A%5BInstall%5D%0AWantedBy%3Dsockets.target%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/system/myapp.service%0A%5BUnit%5D%0ADescription%3DMyApp%20Service%0ARequires%3Dmyapp.socket%0A%0A%5BService%5D%0AType%3Dnotify%0AExecStart%3D/usr/local/bin/myapp-service%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22systemd_1%22%3E%E5%9B%9B%E3%80%81%E5%AE%89%E5%85%A8%E6%B2%99%E7%AE%B1%EF%BC%9Asystemd%20%E7%9A%84%E8%BF%9B%E7%A8%8B%E7%BA%A7%E9%9A%94%E7%A6%BB%3C/h2%3E%0A%3Ch3%20id%3D%2241%22%3E4.1%20%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA%E6%8C%87%E4%BB%A4%E5%85%A8%E6%99%AF%E5%9B%BE%3C/h3%3E%0A%3Cp%3Esystemd%20%E6%8F%90%E4%BE%9B%E4%BA%86%E8%B6%85%E8%BF%87%2030%20%E4%B8%AA%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA%E6%8C%87%E4%BB%A4%EF%BC%8C%E8%A6%86%E7%9B%96%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E3%80%81%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E3%80%81%E8%83%BD%E5%8A%9B%E4%BD%8D%E3%80%81%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E7%AD%89%E6%96%B9%E9%9D%A2%EF%BC%9A%3C/p%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3E%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%E2%94%82%20%20%20%20%20%20%20%20%20%20%20%20%20%20systemd%20Security%20Directives%20%E5%85%A8%E6%99%AF%E5%9B%BE%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%9C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%AC%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%A4%0A%E2%94%82%20ProtectSystem%3Dstrict%20%20%E2%94%82%20%E5%8F%AA%E8%AF%BB%E6%8C%82%E8%BD%BD%20/usr%20/boot%20/etc%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20PrivateTmp%3Dyes%20%20%20%20%20%20%20%20%E2%94%82%20%E7%8B%AC%E7%AB%8B%20/tmp%20/var/tmp%20%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20NoNewPrivileges%3Dyes%20%20%20%E2%94%82%20%E7%A6%81%E6%AD%A2%E6%8F%90%E6%9D%83%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20PrivateDevices%3Dyes%20%20%20%20%E2%94%82%20%E7%8B%AC%E7%AB%8B%E8%AE%BE%E5%A4%87%E5%91%BD%E5%90%8D%E8%8A%82%E7%82%B9%EF%BC%88%E8%99%9A%E6%8B%9F%E5%8C%96%20/dev%EF%BC%89%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20MemoryDenyWriteExecute%E2%94%82%20%E7%A6%81%E6%AD%A2%E5%90%8C%E6%97%B6%E5%8F%AF%E5%86%99%E5%8F%AF%E6%89%A7%E8%A1%8C%E5%86%85%E5%AD%98%EF%BC%88W%5EX%EF%BC%89%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20ProtectHome%3Dyes%20%20%20%20%20%20%20%E2%94%82%20%E9%9A%90%E8%97%8F%20/home%20/root%20/run/user%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20RestrictNamespaces%3D%20%20%20%E2%94%82%20%E9%99%90%E5%88%B6%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%88%9B%E5%BB%BA%E8%83%BD%E5%8A%9B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20SystemCallFilter%3D%20%20%20%20%20%E2%94%82%20seccomp%20%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E7%99%BD%E5%90%8D%E5%8D%95%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20CapabilityBoundingSet%3D%E2%94%82%20%E8%83%BD%E5%8A%9B%E4%BD%8D%E7%99%BD%E5%90%8D%E5%8D%95%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20RestrictAddressFamilies%3D%E2%94%82%20%E9%99%90%E5%88%B6%20socket%20%E5%9C%B0%E5%9D%80%E6%97%8F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20LockPersonality%3Dyes%20%20%20%E2%94%82%20%E9%94%81%E5%AE%9A%20personality%20%E9%98%B2%E6%AD%A2%E5%BC%82%E5%B8%B8%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%B4%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2242%22%3E4.2%20%E7%94%9F%E4%BA%A7%E7%BA%A7%E5%AE%89%E5%85%A8%E6%B2%99%E7%AE%B1%E9%85%8D%E7%BD%AE%E6%A8%A1%E6%9D%BF%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/system/webapp.service.d/override.conf%0A%5BService%5D%0A%23%20%3D%3D%3D%20%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E9%9A%94%E7%A6%BB%20%3D%3D%3D%0AProtectSystem%3Dstrict%0AProtectHome%3Dread-only%0AReadOnlyPaths%3D/etc/ssl%0AReadWritePaths%3D/var/lib/webapp%20/var/log/webapp%20/tmp%0A%0A%23%20%3D%3D%3D%20%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E9%9A%94%E7%A6%BB%20%3D%3D%3D%0APrivateTmp%3Dyes%0APrivateDevices%3Dyes%0APrivateUsers%3Dyes%0AProtectKernelTunables%3Dyes%0AProtectKernelModules%3Dyes%0AProtectControlGroups%3Dyes%0ARestrictNamespaces%3Dyes%0A%0A%23%20%3D%3D%3D%20%E5%AE%89%E5%85%A8%E8%83%BD%E5%8A%9B%E9%99%90%E5%88%B6%20%3D%3D%3D%0ANoNewPrivileges%3Dyes%0ACapabilityBoundingSet%3DCAP_NET_BIND_SERVICE%20CAP_SETUID%20CAP_SETGID%0A%0A%23%20%3D%3D%3D%20%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E8%BF%87%E6%BB%A4%20%3D%3D%3D%0ASystemCallFilter%3D%40system-service%0ASystemCallFilter%3D~%40mount%20%40reboot%20%40swap%20%40clock%20%40module%0ASystemCallArchitectures%3Dnative%0A%0A%23%20%3D%3D%3D%20%E5%86%85%E5%AD%98%E5%AE%89%E5%85%A8%20%3D%3D%3D%0AMemoryDenyWriteExecute%3Dyes%0A%0A%23%20%3D%3D%3D%20%E7%BD%91%E7%BB%9C%E9%99%90%E5%88%B6%20%3D%3D%3D%0ARestrictAddressFamilies%3DAF_INET%20AF_INET6%20AF_UNIX%20AF_NETLINK%0A%0A%23%20%3D%3D%3D%20%E8%BF%90%E8%A1%8C%E6%97%B6%E9%99%90%E5%88%B6%20%3D%3D%3D%0AProtectClock%3Dyes%0AProtectHostname%3Dyes%0ARestrictSUIDSGID%3Dyes%0ARemoveIPC%3Dyes%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2243-rust-systemd%22%3E4.3%20Rust%20%E5%AE%9E%E7%8E%B0%20Systemd%20%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA%E5%AE%A1%E8%AE%A1%E5%B7%A5%E5%85%B7%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-rust%22%3E//%20seccomp_audit.rs%20-%20%E5%88%86%E6%9E%90%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE%E7%9A%84%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA%E7%A8%8B%E5%BA%A6%0Ause%20std%3A%3Acollections%3A%3AHashSet%3B%0Ause%20std%3A%3Apath%3A%3APathBuf%3B%0Ause%20ini%3A%3AIni%3B%0A%0Astruct%20SecurityAudit%20%7B%0A%20%20%20%20score%3A%20u32%2C%0A%20%20%20%20max_score%3A%20u32%2C%0A%20%20%20%20recommendations%3A%20Vec%26lt%3BString%26gt%3B%2C%0A%7D%0A%0Aimpl%20SecurityAudit%20%7B%0A%20%20%20%20fn%20new%28%29%20-%26gt%3B%20Self%20%7B%0A%20%20%20%20%20%20%20%20SecurityAudit%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20score%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_score%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20recommendations%3A%20Vec%3A%3Anew%28%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20check_protect_system%28%26amp%3Bmut%20self%2C%20section%3A%20%26amp%3Bini%3A%3AProperties%29%20%7B%0A%20%20%20%20%20%20%20%20self.max_score%20%2B%3D%2010%3B%0A%20%20%20%20%20%20%20%20match%20section.get%28%26quot%3BProtectSystem%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28%26quot%3Bstrict%26quot%3B%29%20%3D%26gt%3B%20self.score%20%2B%3D%2010%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28%26quot%3Bfull%26quot%3B%29%20%3D%26gt%3B%20self.score%20%2B%3D%208%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28%26quot%3Byes%26quot%3B%29%20%3D%26gt%3B%20self.score%20%2B%3D%206%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%26gt%3B%20self.recommendations.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E5%BB%BA%E8%AE%AE%E8%AE%BE%E7%BD%AE%20ProtectSystem%3Dstrict%EF%BC%8C%E5%8F%AA%E8%AF%BB%E6%8C%82%E8%BD%BD%E7%B3%BB%E7%BB%9F%E7%9B%AE%E5%BD%95%26quot%3B.to_string%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20check_private_devices%28%26amp%3Bmut%20self%2C%20section%3A%20%26amp%3Bini%3A%3AProperties%29%20%7B%0A%20%20%20%20%20%20%20%20self.max_score%20%2B%3D%208%3B%0A%20%20%20%20%20%20%20%20match%20section.get%28%26quot%3BPrivateDevices%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28%26quot%3Byes%26quot%3B%29%20%3D%26gt%3B%20self.score%20%2B%3D%208%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%26gt%3B%20self.recommendations.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E5%BB%BA%E8%AE%AE%E8%AE%BE%E7%BD%AE%20PrivateDevices%3Dyes%EF%BC%8C%E9%9A%94%E7%A6%BB%E8%AE%BE%E5%A4%87%E8%AE%BF%E9%97%AE%26quot%3B.to_string%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20check_no_new_privileges%28%26amp%3Bmut%20self%2C%20section%3A%20%26amp%3Bini%3A%3AProperties%29%20%7B%0A%20%20%20%20%20%20%20%20self.max_score%20%2B%3D%208%3B%0A%20%20%20%20%20%20%20%20match%20section.get%28%26quot%3BNoNewPrivileges%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28%26quot%3Byes%26quot%3B%29%20%3D%26gt%3B%20self.score%20%2B%3D%208%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%26gt%3B%20self.recommendations.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E5%BB%BA%E8%AE%AE%E8%AE%BE%E7%BD%AE%20NoNewPrivileges%3Dyes%EF%BC%8C%E9%98%B2%E6%AD%A2%E6%8F%90%E6%9D%83%E6%94%BB%E5%87%BB%26quot%3B.to_string%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20check_memory_deny_write_execute%28%26amp%3Bmut%20self%2C%20section%3A%20%26amp%3Bini%3A%3AProperties%29%20%7B%0A%20%20%20%20%20%20%20%20self.max_score%20%2B%3D%2010%3B%0A%20%20%20%20%20%20%20%20match%20section.get%28%26quot%3BMemoryDenyWriteExecute%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28%26quot%3Byes%26quot%3B%29%20%3D%26gt%3B%20self.score%20%2B%3D%2010%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%26gt%3B%20self.recommendations.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E5%BC%BA%E7%83%88%E5%BB%BA%E8%AE%AE%E8%AE%BE%E7%BD%AE%20MemoryDenyWriteExecute%3Dyes%EF%BC%8C%E5%90%AF%E7%94%A8%20W%5EX%26quot%3B.to_string%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20check_systemcall_filter%28%26amp%3Bmut%20self%2C%20section%3A%20%26amp%3Bini%3A%3AProperties%29%20%7B%0A%20%20%20%20%20%20%20%20self.max_score%20%2B%3D%2012%3B%0A%20%20%20%20%20%20%20%20if%20let%20Some%28filter%29%20%3D%20section.get%28%26quot%3BSystemCallFilter%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20filter.contains%28%27~%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.score%20%2B%3D%2012%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.score%20%2B%3D%206%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.recommendations.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E5%BB%BA%E8%AE%AE%E4%BD%BF%E7%94%A8%20deny-list%20%E6%A8%A1%E5%BC%8F%EF%BC%88%40service-group%20%2B%20~%E9%AB%98%E9%A3%8E%E9%99%A9%E8%B0%83%E7%94%A8%EF%BC%89%26quot%3B.to_string%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20self.recommendations.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E5%BB%BA%E8%AE%AE%E8%AE%BE%E7%BD%AE%20SystemCallFilter%20%E9%99%90%E5%88%B6%E5%8F%AF%E7%94%A8%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%26quot%3B.to_string%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20check_restrict_namespaces%28%26amp%3Bmut%20self%2C%20section%3A%20%26amp%3Bini%3A%3AProperties%29%20%7B%0A%20%20%20%20%20%20%20%20self.max_score%20%2B%3D%2010%3B%0A%20%20%20%20%20%20%20%20match%20section.get%28%26quot%3BRestrictNamespaces%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Some%28%26quot%3Byes%26quot%3B%29%20%3D%26gt%3B%20self.score%20%2B%3D%2010%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%26gt%3B%20self.recommendations.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E5%BB%BA%E8%AE%AE%E8%AE%BE%E7%BD%AE%20RestrictNamespaces%3Dyes%EF%BC%8C%E9%98%B2%E6%AD%A2%E7%94%A8%E6%88%B7%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E9%80%83%E9%80%B8%26quot%3B.to_string%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20audit_service_file%26lt%3BP%3A%20AsRef%26lt%3Bstd%3A%3Apath%3A%3APath%26gt%3B%26gt%3B%28%0A%20%20%20%20%20%20%20%20path%3A%20P%2C%0A%20%20%20%20%29%20-%26gt%3B%20Result%26lt%3BSelf%2C%20Box%26lt%3Bdyn%20std%3A%3Aerror%3A%3AError%26gt%3B%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20let%20conf%20%3D%20Ini%3A%3Aload_from_file%28path%29%3F%3B%0A%20%20%20%20%20%20%20%20let%20mut%20audit%20%3D%20SecurityAudit%3A%3Anew%28%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20let%20Some%28service_section%29%20%3D%20conf.section%28Some%28%26quot%3BService%26quot%3B%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_protect_system%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_private_devices%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_no_new_privileges%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_memory_deny_write_execute%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_systemcall_filter%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_restrict_namespaces%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_private_tmp%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_protect_home%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20audit.check_capability_bound%28service_section%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20Ok%28audit%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20fn%20generate_report%28%26amp%3Bself%29%20-%26gt%3B%20String%20%7B%0A%20%20%20%20%20%20%20%20let%20percentage%20%3D%20%28self.score%20%2A%20100%29%20/%20self.max_score.max%281%29%3B%0A%20%20%20%20%20%20%20%20let%20grade%20%3D%20match%20percentage%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%2090..%3D100%20%3D%26gt%3B%20%26quot%3BA%2B%20%28%E4%BC%98%E7%A7%80%29%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%2080..%3D89%20%3D%26gt%3B%20%26quot%3BA%20%28%E8%89%AF%E5%A5%BD%29%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%2070..%3D79%20%3D%26gt%3B%20%26quot%3BB%20%28%E4%B8%AD%E7%AD%89%29%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%2060..%3D69%20%3D%26gt%3B%20%26quot%3BC%20%28%E5%8F%8A%E6%A0%BC%29%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%2050..%3D59%20%3D%26gt%3B%20%26quot%3BD%20%28%E9%9C%80%E6%94%B9%E8%BF%9B%29%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%26gt%3B%20%26quot%3BF%20%28%E9%AB%98%E9%A3%8E%E9%99%A9%29%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20let%20mut%20report%20%3D%20format%21%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B%E2%95%94%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%97%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%95%91%20%20%20%20%20%20Systemd%20Security%20Audit%20Report%20%20%20%20%20%20%20%E2%95%91%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%95%A0%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%A3%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%95%91%20%20%E5%AE%89%E5%85%A8%E8%AF%84%E5%88%86%3A%20%7B%7D/%7B%7D%20%28%7B%3A.0%7D%25%29%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%95%91%20%20%E5%AE%89%E5%85%A8%E7%AD%89%E7%BA%A7%3A%20%7B%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Cn%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%95%9A%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%9D%5Cn%5Cn%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20self.score%2C%20self.max_score%2C%20percentage%2C%20grade%0A%20%20%20%20%20%20%20%20%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20%21self.recommendations.is_empty%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20report.push_str%28%26quot%3B%F0%9F%94%A7%20%E4%BC%98%E5%8C%96%E5%BB%BA%E8%AE%AE%3A%5Cn%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28i%2C%20rec%29%20in%20self.recommendations.iter%28%29.enumerate%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20report.push_str%28%26amp%3Bformat%21%28%26quot%3B%20%20%20%7B%7D.%20%7B%7D%5Cn%26quot%3B%2C%20i%20%2B%201%2C%20rec%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20report%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main%28%29%20%7B%0A%20%20%20%20let%20args%3A%20Vec%26lt%3BString%26gt%3B%20%3D%20std%3A%3Aenv%3A%3Aargs%28%29.collect%28%29%3B%0A%20%20%20%20if%20args.len%28%29%20%26lt%3B%202%20%7B%0A%20%20%20%20%20%20%20%20eprintln%21%28%26quot%3B%E7%94%A8%E6%B3%95%3A%20systemctl%20audit-security%20%26lt%3Bunit-file%26gt%3B%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20std%3A%3Aprocess%3A%3Aexit%281%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20path%20%3D%20PathBuf%3A%3Afrom%28%26amp%3Bargs%5B1%5D%29%3B%0A%20%20%20%20match%20SecurityAudit%3A%3Aaudit_service_file%28%26amp%3Bpath%29%20%7B%0A%20%20%20%20%20%20%20%20Ok%28audit%29%20%3D%26gt%3B%20println%21%28%26quot%3B%7B%7D%26quot%3B%2C%20audit.generate_report%28%29%29%2C%0A%20%20%20%20%20%20%20%20Err%28e%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20eprintln%21%28%26quot%3B%E5%AE%A1%E8%AE%A1%E5%A4%B1%E8%B4%A5%3A%20%7B%7D%26quot%3B%2C%20e%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20std%3A%3Aprocess%3A%3Aexit%281%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2244-capabilities%22%3E4.4%20%E8%83%BD%E5%8A%9B%E4%BD%8D%EF%BC%88Capabilities%EF%BC%89%E7%B2%BE%E7%BB%86%E7%AE%A1%E6%8E%A7%3C/h3%3E%0A%3Cp%3ELinux%20capabilities%20%E5%B0%86%20root%20%E6%9D%83%E9%99%90%E6%8B%86%E5%88%86%E4%B8%BA%E7%BA%A6%2040%20%E4%B8%AA%E7%8B%AC%E7%AB%8B%E7%9A%84%E6%9D%83%E9%99%90%E5%8D%95%E5%85%83%EF%BC%9A%3C/p%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%5BService%5D%0A%23%20%E5%8F%AA%E4%BF%9D%E7%95%99%E6%9C%80%E5%B0%8F%E5%BF%85%E9%9C%80%E8%83%BD%E5%8A%9B%0ACapabilityBoundingSet%3DCAP_NET_BIND_SERVICE%20CAP_CHOWN%20CAP_SETUID%20CAP_SETGID%0A%0A%23%20AmbientCapabilities%20%E5%86%B3%E5%AE%9A%20execve%20%E5%90%8E%E6%98%AF%E5%90%A6%E7%BB%A7%E6%89%BF%0AAmbientCapabilities%3DCAP_NET_BIND_SERVICE%0A%0A%23%20%E7%A7%BB%E9%99%A4%E6%89%80%E6%9C%89%E5%85%B6%E4%BB%96%E8%83%BD%E5%8A%9B%0ACapabilityBoundingSet%3D~CAP_SYS_ADMIN%0ACapabilityBoundingSet%3D~CAP_SYS_PTRACE%0ACapabilityBoundingSet%3D~CAP_SYS_MODULE%0ACapabilityBoundingSet%3D~CAP_SYS_RAWIO%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22cgroups-v2%22%3E%E4%BA%94%E3%80%81%E8%B5%84%E6%BA%90%E7%AE%A1%E6%8E%A7%EF%BC%9Acgroups%20v2%20%E6%B7%B1%E5%BA%A6%E9%9B%86%E6%88%90%3C/h2%3E%0A%3Ch3%20id%3D%2251-cgroups-v2-systemd%22%3E5.1%20cgroups%20v2%20%E4%B8%8E%20systemd%20%E7%9A%84%E8%9E%8D%E5%90%88%E6%9E%B6%E6%9E%84%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3Esystemd%20slice%20%E5%B1%82%E7%BA%A7%EF%BC%9A%0A%E2%94%9C%E2%94%80%E2%94%80%20system.slice%20%20%20%20%20%20%20%20%23%20%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1%0A%E2%94%82%20%20%20%E2%94%9C%E2%94%80%E2%94%80%20systemd-journald.service%0A%E2%94%82%20%20%20%E2%94%94%E2%94%80%E2%94%80%20sshd.service%0A%E2%94%9C%E2%94%80%E2%94%80%20user.slice%20%20%20%20%20%20%20%20%20%20%23%20%E7%94%A8%E6%88%B7%E4%BC%9A%E8%AF%9D%0A%E2%94%82%20%20%20%E2%94%94%E2%94%80%E2%94%80%20user-1000.slice%0A%E2%94%82%20%20%20%20%20%20%20%E2%94%94%E2%94%80%E2%94%80%20app.service%0A%E2%94%94%E2%94%80%E2%94%80%20machine.slice%20%20%20%20%20%20%20%23%20%E8%99%9A%E6%8B%9F%E6%9C%BA/%E5%AE%B9%E5%99%A8%0A%20%20%20%20%E2%94%94%E2%94%80%E2%94%80%20qemu-vm.service%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2252-cpu%22%3E5.2%20CPU%20%E8%B5%84%E6%BA%90%E7%AE%A1%E6%8E%A7%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%5BService%5D%0A%23%20CPU%20%E7%9B%B8%E5%AF%B9%E6%9D%83%E9%87%8D%EF%BC%88%E9%BB%98%E8%AE%A4%20100%EF%BC%8C%E8%8C%83%E5%9B%B4%201-10000%EF%BC%89%0ACPUWeight%3D50%0A%0A%23%20CPU%20%E4%BA%B2%E5%92%8C%E6%80%A7%EF%BC%88%E7%BB%91%E5%AE%9A%E5%88%B0%E7%89%B9%E5%AE%9A%E6%A0%B8%E5%BF%83%EF%BC%89%0ACPUAffinity%3D0%201%202%203%0A%0A%23%20CPU%20%E6%97%B6%E9%97%B4%E9%85%8D%E9%A2%9D%EF%BC%88200%25%20%E8%A1%A8%E7%A4%BA%E6%9C%80%E5%A4%9A%E4%BD%BF%E7%94%A8%202%20%E4%B8%AA%E6%A0%B8%E5%BF%83%EF%BC%89%0ACPUQuota%3D200%25%0A%0A%23%20CPUQuotaPerSecUSec%20%E6%AF%8F%E7%A7%92%E9%85%8D%E9%A2%9D%EF%BC%88%E6%9B%BF%E4%BB%A3%20CPUQuota%EF%BC%89%0ACPUQuotaPerSecUSec%3D500ms%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2253%22%3E5.3%20%E5%86%85%E5%AD%98%E8%B5%84%E6%BA%90%E7%AE%A1%E6%8E%A7%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%5BService%5D%0A%23%20%E7%A1%AC%E9%99%90%E5%88%B6%EF%BC%9AOOM%20Killer%20%E8%A7%A6%E5%8F%91%E9%98%88%E5%80%BC%0AMemoryMax%3D512M%0A%0A%23%20%E8%BD%AF%E9%99%90%E5%88%B6%EF%BC%9A%E5%86%85%E6%A0%B8%E5%B0%BD%E5%8A%9B%E5%9B%9E%E6%94%B6%0AMemoryHigh%3D450M%0A%0A%23%20swap%20%E9%99%90%E5%88%B6%0AMemorySwapMax%3D100M%0A%0A%23%20%E5%86%85%E5%AD%98%E5%8E%8B%E5%8A%9B%E9%80%9A%E7%9F%A5%EF%BC%88%E9%9C%80%E8%A6%81%E5%86%85%E6%A0%B8%205.17%2B%EF%BC%89%0AMemoryPressureWatch%3Dsome%0AMemoryPressureThresholdSec%3D100ms%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2254-io%22%3E5.4%20IO%20%E4%B8%8E%E7%BD%91%E7%BB%9C%E8%B5%84%E6%BA%90%E7%AE%A1%E6%8E%A7%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%5BService%5D%0A%23%20IO%20%E6%9D%83%E9%87%8D%0AIOWeight%3D50%0A%0A%23%20%E7%89%B9%E5%AE%9A%E8%AE%BE%E5%A4%87%20IO%20%E9%99%90%E5%88%B6%0AIODeviceWeight%3D/dev/sda%2050%0AIOReadBandwidthMax%3D/dev/sda%2050M%0AIOWriteBandwidthMax%3D/dev/sda%2030M%0A%0A%23%20%E7%BD%91%E7%BB%9C%E5%B8%A6%E5%AE%BD%0AIPAccounting%3Dyes%0AIPAddressAllow%3D10.0.0.0/8%0AIPAddressDeny%3Dany%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2255-rust%22%3E5.5%20Rust%20%E5%AE%9E%E7%8E%B0%E8%B5%84%E6%BA%90%E7%9B%91%E6%8E%A7%E4%BB%AA%E8%A1%A8%E6%9D%BF%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-rust%22%3E//%20systemd_resource_monitor.rs%0Ause%20std%3A%3Apath%3A%3APathBuf%3B%0A%0Astruct%20CgroupMetrics%20%7B%0A%20%20%20%20cpu_usage_nanos%3A%20u64%2C%0A%20%20%20%20memory_current%3A%20u64%2C%0A%20%20%20%20memory_peak%3A%20u64%2C%0A%20%20%20%20io_read_bytes%3A%20u64%2C%0A%20%20%20%20io_write_bytes%3A%20u64%2C%0A%20%20%20%20pids_current%3A%20u32%2C%0A%7D%0A%0Afn%20read_cgroup_metrics%28unit%3A%20%26amp%3Bstr%29%20-%26gt%3B%20Result%26lt%3BCgroupMetrics%2C%20Box%26lt%3Bdyn%20std%3A%3Aerror%3A%3AError%26gt%3B%26gt%3B%20%7B%0A%20%20%20%20if%20let%20Some%28metrics%29%20%3D%20try_v2%28unit%29%3F%20%7B%0A%20%20%20%20%20%20%20%20return%20Ok%28metrics%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20try_v1%28unit%29%0A%7D%0A%0Afn%20try_v2%28unit%3A%20%26amp%3Bstr%29%20-%26gt%3B%20Result%26lt%3BOption%26lt%3BCgroupMetrics%26gt%3B%2C%20Box%26lt%3Bdyn%20std%3A%3Aerror%3A%3AError%26gt%3B%26gt%3B%20%7B%0A%20%20%20%20let%20cgroup_path%20%3D%20PathBuf%3A%3Afrom%28%26quot%3B/sys/fs/cgroup%26quot%3B%29%0A%20%20%20%20%20%20%20%20.join%28format%21%28%26quot%3Bsystem.slice/%7B%7D.service%26quot%3B%2C%20unit%29%29%3B%0A%0A%20%20%20%20if%20%21cgroup_path.exists%28%29%20%7B%0A%20%20%20%20%20%20%20%20return%20Ok%28None%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20cpu_stat%20%3D%20std%3A%3Afs%3A%3Aread_to_string%28cgroup_path.join%28%26quot%3Bcpu.stat%26quot%3B%29%29%3F%3B%0A%20%20%20%20let%20cpu_usage_nanos%20%3D%20cpu_stat%0A%20%20%20%20%20%20%20%20.lines%28%29%0A%20%20%20%20%20%20%20%20.find%28%7Cl%7C%20l.starts_with%28%26quot%3Busage_usec%26quot%3B%29%29%0A%20%20%20%20%20%20%20%20.and_then%28%7Cl%7C%20l.split_whitespace%28%29.nth%281%29%29%0A%20%20%20%20%20%20%20%20.and_then%28%7Cv%7C%20v.parse%3A%3A%26lt%3Bu64%26gt%3B%28%29.ok%28%29%29%0A%20%20%20%20%20%20%20%20.unwrap_or%280%29%20%2A%201000%3B%0A%0A%20%20%20%20let%20memory_current%20%3D%20std%3A%3Afs%3A%3Aread_to_string%28cgroup_path.join%28%26quot%3Bmemory.current%26quot%3B%29%29%3F%0A%20%20%20%20%20%20%20%20.trim%28%29%0A%20%20%20%20%20%20%20%20.parse%3A%3A%26lt%3Bu64%26gt%3B%28%29%3F%3B%0A%0A%20%20%20%20let%20memory_peak%20%3D%20std%3A%3Afs%3A%3Aread_to_string%28cgroup_path.join%28%26quot%3Bmemory.peak%26quot%3B%29%29%3F%0A%20%20%20%20%20%20%20%20.trim%28%29%0A%20%20%20%20%20%20%20%20.parse%3A%3A%26lt%3Bu64%26gt%3B%28%29%0A%20%20%20%20%20%20%20%20.unwrap_or%280%29%3B%0A%0A%20%20%20%20let%20mut%20io_read_bytes%20%3D%200%3B%0A%20%20%20%20let%20mut%20io_write_bytes%20%3D%200%3B%0A%20%20%20%20if%20let%20Ok%28io_stat%29%20%3D%20std%3A%3Afs%3A%3Aread_to_string%28cgroup_path.join%28%26quot%3Bio.stat%26quot%3B%29%29%20%7B%0A%20%20%20%20%20%20%20%20for%20line%20in%20io_stat.lines%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20line.contains%28%26quot%3Brbytes%3D%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20let%20Some%28val%29%20%3D%20line.split%28%26quot%3Brbytes%3D%26quot%3B%29.nth%281%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20let%20Some%28num%29%20%3D%20val.split_whitespace%28%29.next%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20io_read_bytes%20%2B%3D%20num.parse%3A%3A%26lt%3Bu64%26gt%3B%28%29.unwrap_or%280%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20line.contains%28%26quot%3Bwbytes%3D%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20let%20Some%28val%29%20%3D%20line.split%28%26quot%3Bwbytes%3D%26quot%3B%29.nth%281%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20let%20Some%28num%29%20%3D%20val.split_whitespace%28%29.next%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20io_write_bytes%20%2B%3D%20num.parse%3A%3A%26lt%3Bu64%26gt%3B%28%29.unwrap_or%280%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20pids_current%20%3D%20std%3A%3Afs%3A%3Aread_to_string%28cgroup_path.join%28%26quot%3Bpids.current%26quot%3B%29%29%3F%0A%20%20%20%20%20%20%20%20.trim%28%29%0A%20%20%20%20%20%20%20%20.parse%3A%3A%26lt%3Bu32%26gt%3B%28%29%0A%20%20%20%20%20%20%20%20.unwrap_or%280%29%3B%0A%0A%20%20%20%20Ok%28Some%28CgroupMetrics%20%7B%0A%20%20%20%20%20%20%20%20cpu_usage_nanos%2C%0A%20%20%20%20%20%20%20%20memory_current%2C%0A%20%20%20%20%20%20%20%20memory_peak%2C%0A%20%20%20%20%20%20%20%20io_read_bytes%2C%0A%20%20%20%20%20%20%20%20io_write_bytes%2C%0A%20%20%20%20%20%20%20%20pids_current%2C%0A%20%20%20%20%7D%29%29%0A%7D%0A%0Afn%20format_bytes%28bytes%3A%20u64%29%20-%26gt%3B%20String%20%7B%0A%20%20%20%20const%20UNITS%3A%20%26amp%3B%5B%26amp%3Bstr%5D%20%3D%20%26amp%3B%5B%26quot%3BB%26quot%3B%2C%20%26quot%3BKiB%26quot%3B%2C%20%26quot%3BMiB%26quot%3B%2C%20%26quot%3BGiB%26quot%3B%2C%20%26quot%3BTiB%26quot%3B%5D%3B%0A%20%20%20%20let%20mut%20bytes%20%3D%20bytes%20as%20f64%3B%0A%20%20%20%20let%20mut%20unit_idx%20%3D%200%3B%0A%0A%20%20%20%20while%20bytes%20%26gt%3B%201024.0%20%26amp%3B%26amp%3B%20unit_idx%20%26lt%3B%20UNITS.len%28%29%20-%201%20%7B%0A%20%20%20%20%20%20%20%20bytes%20/%3D%201024.0%3B%0A%20%20%20%20%20%20%20%20unit_idx%20%2B%3D%201%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20format%21%28%26quot%3B%7B%3A.2%7D%20%7B%7D%26quot%3B%2C%20bytes%2C%20UNITS%5Bunit_idx%5D%29%0A%7D%0A%0Afn%20main%28%29%20%7B%0A%20%20%20%20let%20args%3A%20Vec%26lt%3BString%26gt%3B%20%3D%20std%3A%3Aenv%3A%3Aargs%28%29.collect%28%29%3B%0A%20%20%20%20let%20unit%20%3D%20args.get%281%29.map%28%7Cs%7C%20s.as_str%28%29%29.unwrap_or%28%26quot%3Bnginx.service%26quot%3B%29%3B%0A%0A%20%20%20%20match%20read_cgroup_metrics%28unit%29%20%7B%0A%20%20%20%20%20%20%20%20Ok%28metrics%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%94%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%97%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%20%20%20Systemd%20Cgroup%20Metrics%3A%20%7B%3A%26lt%3B17%7D%20%E2%95%91%26quot%3B%2C%20unit%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%A0%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%A3%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20CPU%20%E4%BD%BF%E7%94%A8%3A%20%20%7B%3A.2%7D%20ms%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%95%91%26quot%3B%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20metrics.cpu_usage_nanos%20as%20f64%20/%201_000_000.0%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E5%86%85%E5%AD%98%E5%BD%93%E5%89%8D%3A%20%20%7B%3A%26lt%3B30%7D%20%20%20%20%E2%95%91%26quot%3B%2C%20format_bytes%28metrics.memory_current%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E5%86%85%E5%AD%98%E5%B3%B0%E5%80%BC%3A%20%20%7B%3A%26lt%3B30%7D%20%20%20%20%E2%95%91%26quot%3B%2C%20format_bytes%28metrics.memory_peak%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20IO%20%E8%AF%BB%E5%8F%96%3A%20%20%20%7B%3A%26lt%3B30%7D%20%20%20%20%E2%95%91%26quot%3B%2C%20format_bytes%28metrics.io_read_bytes%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20IO%20%E5%86%99%E5%85%A5%3A%20%20%20%7B%3A%26lt%3B30%7D%20%20%20%20%E2%95%91%26quot%3B%2C%20format_bytes%28metrics.io_write_bytes%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E8%BF%9B%E7%A8%8B%E6%95%B0%E9%87%8F%3A%20%20%7B%3A%26lt%3B30%7D%20%20%20%20%E2%95%91%26quot%3B%2C%20metrics.pids_current%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%9A%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%9D%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20Err%28e%29%20%3D%26gt%3B%20eprintln%21%28%26quot%3B%E9%94%99%E8%AF%AF%3A%20%7B%7D%26quot%3B%2C%20e%29%2C%0A%20%20%20%20%7D%0A%7D%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22timer-cron%22%3E%E5%85%AD%E3%80%81Timer%20%E8%B0%83%E5%BA%A6%EF%BC%9A%E6%9B%BF%E4%BB%A3%20cron%20%E7%9A%84%E7%8E%B0%E4%BB%A3%E6%96%B9%E6%A1%88%3C/h2%3E%0A%3Ch3%20id%3D%2261-timer-vs-cron%22%3E6.1%20Timer%20vs%20Cron%20%E5%AF%B9%E6%AF%94%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3E%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%AC%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%AC%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%E2%94%82%20%20%20%20%20%20%20%20%E7%89%B9%E6%80%A7%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%20%20%20%20%20%20%20cron%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%20%20%20systemd%20timer%20%20%20%20%20%E2%94%82%0A%E2%94%9C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%BC%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%BC%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%A4%0A%E2%94%82%20%E6%97%A5%E5%BF%97%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20syslog%EF%BC%88%E9%9C%80%E9%A2%9D%E5%A4%96%E9%85%8D%E7%BD%AE%EF%BC%89%20%E2%94%82%20journal%EF%BC%88%E7%BB%9F%E4%B8%80%EF%BC%89%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E6%9C%80%E5%B0%8F%E7%8E%AF%E5%A2%83%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E5%8F%AF%E6%8E%A7%E7%8E%AF%E5%A2%83%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20%E5%A4%B1%E8%B4%A5%E9%80%9A%E7%9F%A5%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E6%97%A0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20OnFailure%3D%20%E8%A7%A6%E5%8F%91%E5%99%A8%20%20%20%20%E2%94%82%0A%E2%94%82%20%E8%B6%85%E6%97%B6%E6%8E%A7%E5%88%B6%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E6%97%A0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20TimeoutStartSec%3D%20%20%20%20%20%E2%94%82%0A%E2%94%82%20%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E6%97%A0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20After/Requires%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%82%20%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E6%97%A0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E4%BD%BF%E7%94%A8%20Service%20%E8%B5%84%E6%BA%90%E6%8E%A7%E5%88%B6%E2%94%82%0A%E2%94%82%20%E9%94%99%E8%BF%87%E6%89%A7%E8%A1%8C%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E7%9B%B4%E6%8E%A5%E8%B7%B3%E8%BF%87%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20Persistent%3D%20%E8%A1%A5%E6%89%A7%E8%A1%8C%20%20%20%20%E2%94%82%0A%E2%94%82%20%E5%88%86%E6%95%A3%E6%8A%96%E5%8A%A8%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E6%97%A0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20RandomizedDelaySec%3D%20%20%E2%94%82%0A%E2%94%82%20%E5%A4%8F%E4%BB%A4%E6%97%B6%E6%84%9F%E7%9F%A5%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E5%8F%AF%E9%80%89%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%20%E5%86%85%E7%BD%AE%E6%84%9F%E7%9F%A5%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%B4%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%B4%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2262-timer%22%3E6.2%20%E9%AB%98%E7%BA%A7%20Timer%20%E9%85%8D%E7%BD%AE%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/system/backup.timer%0A%5BUnit%5D%0ADescription%3DDaily%20Backup%20Timer%0ARequires%3Dbackup.service%0A%0A%5BTimer%5D%0A%23%20%E6%AF%8F%E5%A4%A9%E5%87%8C%E6%99%A8%202%3A30%20%E6%89%A7%E8%A1%8C%0AOnCalendar%3D%2A-%2A-%2A%2002%3A30%3A00%0A%0A%23%20%E5%A6%82%E6%9E%9C%E4%B8%8A%E6%AC%A1%E6%89%A7%E8%A1%8C%E9%94%99%E8%BF%87%EF%BC%88%E5%A6%82%E7%B3%BB%E7%BB%9F%E5%85%B3%E6%9C%BA%EF%BC%89%EF%BC%8C%E5%90%AF%E5%8A%A8%E5%90%8E%E7%AB%8B%E5%8D%B3%E8%A1%A5%E6%89%A7%E8%A1%8C%0APersistent%3Dtrue%0A%0A%23%20%E9%9A%8F%E6%9C%BA%E5%BB%B6%E8%BF%9F%205%20%E5%88%86%E9%92%9F%E9%81%BF%E5%85%8D%E6%89%80%E6%9C%89%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%8C%E6%97%B6%E5%8F%91%E8%B5%B7%0ARandomizedDelaySec%3D300%0A%0A%23%20%E5%8D%95%E8%B0%83%E5%AE%9A%E6%97%B6%E5%99%A8%EF%BC%9A%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E5%90%8E%2015%20%E5%88%86%E9%92%9F%E9%A6%96%E6%AC%A1%E6%89%A7%E8%A1%8C%EF%BC%8C%E4%B9%8B%E5%90%8E%E6%AF%8F%201%20%E5%B0%8F%E6%97%B6%0AOnBootSec%3D900%0AOnUnitActiveSec%3D1h%0A%0A%23%20%E5%86%99%E5%85%A5%E6%97%B6%E9%97%B4%E6%96%87%E4%BB%B6%E8%AE%B0%E5%BD%95%E4%B8%8A%E6%AC%A1%E6%89%A7%E8%A1%8C%E6%97%B6%E9%97%B4%0AAccuracySec%3D1us%0A%0A%5BInstall%5D%0AWantedBy%3Dtimers.target%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2263-oncalendar%22%3E6.3%20OnCalendar%20%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F%E8%BF%9B%E9%98%B6%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20%E7%B2%BE%E7%A1%AE%E6%97%B6%E9%97%B4%E8%A1%A8%E8%BE%BE%E5%BC%8F%0AOnCalendar%3DMon%2CTue%2CWed%2CThu%2CFri%20%2A-%2A-%2A%2009%3A00%3A00%20%20%20%20%23%20%E5%B7%A5%E4%BD%9C%E6%97%A5%209%20%E7%82%B9%0AOnCalendar%3D%2A-%2A-01%2000%3A00%3A00%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%AF%8F%E6%9C%88%201%20%E5%8F%B7%E5%8D%88%E5%A4%9C%0AOnCalendar%3DWed%2CSat%20%2A-%2A-%2A%2023%3A59%3A00%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%91%A8%E4%B8%89%E5%91%A8%E5%85%AD%2023%3A59%0AOnCalendar%3D%2A-%2A-%2A%20%2A%3A0/15%3A00%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%AF%8F%2015%20%E5%88%86%E9%92%9F%0AOnCalendar%3DMon%20%2A-1-1%2C4-1%2C7-1%2C10-1%2009%3A00%3A00%20%20%20%20%20%20%20%20%20%20%23%20%E6%AF%8F%E5%AD%A3%E5%BA%A6%E7%AC%AC%E4%B8%80%E5%A4%A9%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2264-rust-timer%22%3E6.4%20Rust%20%E5%AE%9E%E7%8E%B0%20Timer%20%E9%85%8D%E7%BD%AE%E7%94%9F%E6%88%90%E5%99%A8%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-rust%22%3E//%20timer_config_generator.rs%0Ause%20std%3A%3Afmt%3B%0A%0A%23%5Bderive%28Debug%2C%20Clone%2C%20Copy%29%5D%0Aenum%20ScheduleType%20%7B%0A%20%20%20%20Daily%20%7B%20hour%3A%20u32%2C%20minute%3A%20u32%20%7D%2C%0A%20%20%20%20Weekly%20%7B%20weekday%3A%20Weekday%2C%20hour%3A%20u32%2C%20minute%3A%20u32%20%7D%2C%0A%20%20%20%20IntervalMinutes%28u32%29%2C%0A%20%20%20%20BootDelayMinutes%28u32%29%2C%0A%7D%0A%0A%23%5Bderive%28Debug%2C%20Clone%2C%20Copy%29%5D%0Aenum%20Weekday%20%7B%0A%20%20%20%20Mon%2C%20Tue%2C%20Wed%2C%20Thu%2C%20Fri%2C%20Sat%2C%20Sun%2C%0A%7D%0A%0Aimpl%20fmt%3A%3ADisplay%20for%20Weekday%20%7B%0A%20%20%20%20fn%20fmt%28%26amp%3Bself%2C%20f%3A%20%26amp%3Bmut%20fmt%3A%3AFormatter%29%20-%26gt%3B%20fmt%3A%3AResult%20%7B%0A%20%20%20%20%20%20%20%20match%20self%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Weekday%3A%3AMon%20%3D%26gt%3B%20write%21%28f%2C%20%26quot%3BMon%26quot%3B%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Weekday%3A%3ATue%20%3D%26gt%3B%20write%21%28f%2C%20%26quot%3BTue%26quot%3B%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Weekday%3A%3AWed%20%3D%26gt%3B%20write%21%28f%2C%20%26quot%3BWed%26quot%3B%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Weekday%3A%3AThu%20%3D%26gt%3B%20write%21%28f%2C%20%26quot%3BThu%26quot%3B%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Weekday%3A%3AFri%20%3D%26gt%3B%20write%21%28f%2C%20%26quot%3BFri%26quot%3B%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Weekday%3A%3ASat%20%3D%26gt%3B%20write%21%28f%2C%20%26quot%3BSat%26quot%3B%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20Weekday%3A%3ASun%20%3D%26gt%3B%20write%21%28f%2C%20%26quot%3BSun%26quot%3B%29%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%0Astruct%20TimerConfig%20%7B%0A%20%20%20%20schedule%3A%20ScheduleType%2C%0A%20%20%20%20persistent%3A%20bool%2C%0A%20%20%20%20randomized_delay_sec%3A%20u32%2C%0A%20%20%20%20accuracy_sec%3A%20String%2C%0A%20%20%20%20on_failure%3A%20Option%26lt%3BString%26gt%3B%2C%0A%7D%0A%0Aimpl%20TimerConfig%20%7B%0A%20%20%20%20fn%20to_ini%28%26amp%3Bself%2C%20name%3A%20%26amp%3Bstr%29%20-%26gt%3B%20String%20%7B%0A%20%20%20%20%20%20%20%20let%20mut%20output%20%3D%20String%3A%3Anew%28%29%3B%0A%0A%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3B%5BUnit%5D%5Cn%26quot%3B%29%29%3B%0A%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BDescription%3D%7B%7D%20Timer%5Cn%26quot%3B%2C%20name%29%29%3B%0A%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BRequires%3D%7B%7D.service%5Cn%5Cn%26quot%3B%2C%20name%29%29%3B%0A%0A%20%20%20%20%20%20%20%20output.push_str%28%26quot%3B%5BTimer%5D%5Cn%26quot%3B%29%3B%0A%0A%20%20%20%20%20%20%20%20let%20calendar%20%3D%20match%20self.schedule%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20ScheduleType%3A%3ADaily%20%7B%20hour%2C%20minute%20%7D%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20format%21%28%26quot%3B%2A-%2A-%2A%20%7B%3A02%7D%3A%7B%3A02%7D%3A00%26quot%3B%2C%20hour%2C%20minute%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20ScheduleType%3A%3AWeekly%20%7B%20weekday%2C%20hour%2C%20minute%20%7D%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20format%21%28%26quot%3B%7B%7D%20%2A-%2A-%2A%20%7B%3A02%7D%3A%7B%3A02%7D%3A00%26quot%3B%2C%20weekday%2C%20hour%2C%20minute%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20ScheduleType%3A%3AIntervalMinutes%28min%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20min%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200..%3D59%20%3D%26gt%3B%20format%21%28%26quot%3B%2A-%2A-%2A%20%2A%3A%7B%3A02%7D%3A00%26quot%3B%2C%20min%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2060%20%3D%26gt%3B%20%26quot%3B%2A-%2A-%2A%20%2A%3A00%3A00%26quot%3B.to_string%28%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%26gt%3B%20format%21%28%26quot%3B%2A-%2A-%2A%20%2A%3A0/%7B%7D%3A00%26quot%3B%2C%20min%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20ScheduleType%3A%3ABootDelayMinutes%28delay%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BOnBootSec%3D%7B%7Dmin%5Cn%26quot%3B%2C%20delay%20/%2060%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BOnUnitActiveSec%3D%7B%7Dmin%5Cn%26quot%3B%2C%2060%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%E7%BB%A7%E7%BB%AD%E8%BE%93%E5%87%BA%E5%85%B6%E4%BB%96%E9%85%8D%E7%BD%AE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20self.persistent%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26quot%3BPersistent%3Dtrue%5Cn%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20self.randomized_delay_sec%20%26gt%3B%200%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BRandomizedDelaySec%3D%7B%7D%5Cn%26quot%3B%2C%20self.randomized_delay_sec%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BAccuracySec%3D%7B%7D%5Cn%26quot%3B%2C%20self.accuracy_sec%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26quot%3B%5Cn%5BInstall%5D%5Cn%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26quot%3BWantedBy%3Dtimers.target%5Cn%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20output%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BOnCalendar%3D%7B%7D%5Cn%26quot%3B%2C%20calendar%29%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20self.persistent%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26quot%3BPersistent%3Dtrue%5Cn%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20self.randomized_delay_sec%20%26gt%3B%200%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BRandomizedDelaySec%3D%7B%7D%5Cn%26quot%3B%2C%20self.randomized_delay_sec%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BAccuracySec%3D%7B%7D%5Cn%26quot%3B%2C%20self.accuracy_sec%29%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20let%20Some%28ref%20failure_handler%29%20%3D%20self.on_failure%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20output.push_str%28%26amp%3Bformat%21%28%26quot%3BOnFailure%3D%7B%7D%5Cn%26quot%3B%2C%20failure_handler%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20output.push_str%28%26quot%3B%5Cn%5BInstall%5D%5Cn%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20output.push_str%28%26quot%3BWantedBy%3Dtimers.target%5Cn%26quot%3B%29%3B%0A%0A%20%20%20%20%20%20%20%20output%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20main%28%29%20%7B%0A%20%20%20%20//%20%E7%94%9F%E6%88%90%E6%AF%8F%E6%97%A5%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%20Timer%0A%20%20%20%20let%20backup_timer%20%3D%20TimerConfig%20%7B%0A%20%20%20%20%20%20%20%20schedule%3A%20ScheduleType%3A%3ADaily%20%7B%20hour%3A%202%2C%20minute%3A%2030%20%7D%2C%0A%20%20%20%20%20%20%20%20persistent%3A%20true%2C%0A%20%20%20%20%20%20%20%20randomized_delay_sec%3A%20300%2C%0A%20%20%20%20%20%20%20%20accuracy_sec%3A%20%26quot%3B1us%26quot%3B.to_string%28%29%2C%0A%20%20%20%20%20%20%20%20on_failure%3A%20Some%28%26quot%3Bbackup-failure.service%26quot%3B.to_string%28%29%29%2C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20println%21%28%26quot%3B%7B%7D%26quot%3B%2C%20backup_timer.to_ini%28%26quot%3Bdb-backup%26quot%3B%29%29%3B%0A%7D%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22journald%22%3E%E4%B8%83%E3%80%81Journald%20%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F%E6%B7%B1%E5%BA%A6%E5%AE%9E%E8%B7%B5%3C/h2%3E%0A%3Ch3%20id%3D%2271-journal%22%3E7.1%20Journal%20%E7%BB%93%E6%9E%84%E5%8C%96%E6%9F%A5%E8%AF%A2%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-bash%22%3E%23%20%E6%9F%A5%E8%AF%A2%E7%89%B9%E5%AE%9A%E6%9C%8D%E5%8A%A1%E6%9C%80%E8%BF%91%201%20%E5%B0%8F%E6%97%B6%E7%9A%84%E6%97%A5%E5%BF%97%0Ajournalctl%20--since%20%26quot%3B1%20hour%20ago%26quot%3B%20-u%20myapp.service%20--output%3Dcat%0A%0A%23%20JSON%20%E6%A0%BC%E5%BC%8F%E8%BE%93%E5%87%BA%EF%BC%8C%E4%BE%BF%E4%BA%8E%E5%90%8E%E7%BB%AD%E8%A7%A3%E6%9E%90%0Ajournalctl%20-u%20myapp.service%20--output%3Djson-pretty%20--since%3D%26quot%3B2024-01-01%26quot%3B%0A%0A%23%20%E6%8C%89%E4%BC%98%E5%85%88%E7%BA%A7%E7%AD%9B%E9%80%89%EF%BC%880%3Demerg%20..%207%3Ddebug%EF%BC%89%0Ajournalctl%20-p%20err%20-u%20myapp.service%0A%0A%23%20%E5%AE%9E%E6%97%B6%E7%9B%91%E6%8E%A7%E7%89%B9%E5%AE%9A%E5%AD%97%E6%AE%B5%0Ajournalctl%20-f%20-o%20verbose%20_SYSTEMD_UNIT%3Dmyapp.service%0A%0A%23%20%E6%8C%89%E5%90%AF%E5%8A%A8%E5%91%A8%E6%9C%9F%EF%BC%88boot%EF%BC%89%E8%BF%87%E6%BB%A4%0Ajournalctl%20-b%200%20-u%20myapp.service%20%20%20%23%20%E6%9C%AC%E6%AC%A1%E5%90%AF%E5%8A%A8%0Ajournalctl%20-b%20-1%20-u%20myapp.service%20%20%23%20%E4%B8%8A%E6%AC%A1%E5%90%AF%E5%8A%A8%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2272-journald%22%3E7.2%20Journald%20%E6%8C%81%E4%B9%85%E5%8C%96%E4%B8%8E%E5%AD%98%E5%82%A8%E9%99%90%E5%88%B6%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/journald.conf%0A%5BJournal%5D%0AStorage%3Dpersistent%0ASystemMaxUse%3D500M%0ASystemMaxFileSize%3D50M%0AMaxFileSec%3D1week%0ASyncIntervalSec%3D5m%0ACompress%3Dyes%0ASeal%3Dyes%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2273-rust%22%3E7.3%20Rust%20%E5%AE%9E%E7%8E%B0%E6%99%BA%E8%83%BD%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90%E5%99%A8%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-rust%22%3E//%20journal_analyzer.rs%0Ause%20serde%3A%3ADeserialize%3B%0Ause%20std%3A%3Aprocess%3A%3ACommand%3B%0A%0A%23%5Bderive%28Debug%2C%20Deserialize%29%5D%0Astruct%20JournalEntry%20%7B%0A%20%20%20%20%23%5Bserde%28rename%20%3D%20%26quot%3B__REALTIME_TIMESTAMP%26quot%3B%29%5D%0A%20%20%20%20timestamp%3A%20String%2C%0A%20%20%20%20%23%5Bserde%28rename%20%3D%20%26quot%3BPRIORITY%26quot%3B%29%5D%0A%20%20%20%20priority%3A%20String%2C%0A%20%20%20%20%23%5Bserde%28rename%20%3D%20%26quot%3BMESSAGE%26quot%3B%29%5D%0A%20%20%20%20message%3A%20String%2C%0A%20%20%20%20%23%5Bserde%28rename%20%3D%20%26quot%3B_SYSTEMD_UNIT%26quot%3B%29%5D%0A%20%20%20%20unit%3A%20String%2C%0A%20%20%20%20%23%5Bserde%28retame%20%3D%20%26quot%3B_PID%26quot%3B%29%5D%0A%20%20%20%20pid%3A%20String%2C%0A%7D%0A%0Astruct%20JournalStats%20%7B%0A%20%20%20%20total%3A%20u64%2C%0A%20%20%20%20errors%3A%20u64%2C%0A%20%20%20%20warnings%3A%20u64%2C%0A%20%20%20%20restarts%3A%20u64%2C%0A%20%20%20%20last_error_time%3A%20Option%26lt%3BString%26gt%3B%2C%0A%20%20%20%20top_errors%3A%20Vec%26lt%3B%28String%2C%20u64%29%26gt%3B%2C%0A%7D%0A%0Afn%20analyze_journal%28unit%3A%20%26amp%3Bstr%2C%20since%3A%20%26amp%3Bstr%29%20-%26gt%3B%20Result%26lt%3BJournalStats%2C%20Box%26lt%3Bdyn%20std%3A%3Aerror%3A%3AError%26gt%3B%26gt%3B%20%7B%0A%20%20%20%20let%20output%20%3D%20Command%3A%3Anew%28%26quot%3Bjournalctl%26quot%3B%29%0A%20%20%20%20%20%20%20%20.args%28%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B--output%3Djson%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%26quot%3B--no-pager%26quot%3B%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%26amp%3Bformat%21%28%26quot%3B--since%3D%7B%7D%26quot%3B%2C%20since%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%26amp%3Bformat%21%28%26quot%3B--unit%3D%7B%7D%26quot%3B%2C%20unit%29%2C%0A%20%20%20%20%20%20%20%20%5D%29%0A%20%20%20%20%20%20%20%20.output%28%29%3F%3B%0A%0A%20%20%20%20let%20stdout%20%3D%20String%3A%3Afrom_utf8_lossy%28%26amp%3Boutput.stdout%29%3B%0A%0A%20%20%20%20let%20mut%20stats%20%3D%20JournalStats%20%7B%0A%20%20%20%20%20%20%20%20total%3A%200%2C%0A%20%20%20%20%20%20%20%20errors%3A%200%2C%0A%20%20%20%20%20%20%20%20warnings%3A%200%2C%0A%20%20%20%20%20%20%20%20restarts%3A%200%2C%0A%20%20%20%20%20%20%20%20last_error_time%3A%20None%2C%0A%20%20%20%20%20%20%20%20top_errors%3A%20Vec%3A%3Anew%28%29%2C%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20let%20mut%20error_counts%3A%20std%3A%3Acollections%3A%3AHashMap%26lt%3BString%2C%20u64%26gt%3B%20%3D%20std%3A%3Acollections%3A%3AHashMap%3A%3Anew%28%29%3B%0A%0A%20%20%20%20for%20line%20in%20stdout.lines%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20line.trim%28%29.is_empty%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20let%20Ok%28entry%29%20%3D%20serde_json%3A%3Afrom_str%3A%3A%26lt%3BJournalEntry%26gt%3B%28line%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20stats.total%20%2B%3D%201%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20priority%3A%20u32%20%3D%20entry.priority.parse%28%29.unwrap_or%286%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20priority%20%26lt%3B%3D%203%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats.errors%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats.last_error_time%20%3D%20Some%28entry.timestamp.clone%28%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Aerror_counts.entry%28entry.message.clone%28%29%29.or_insert%280%29%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20priority%20%26lt%3B%3D%204%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats.warnings%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20entry.message.contains%28%26quot%3BMain%20process%20exited%26quot%3B%29%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20entry.message.contains%28%26quot%3BStarted%26quot%3B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats.restarts%20%2B%3D%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20mut%20sorted_errors%3A%20Vec%26lt%3B_%26gt%3B%20%3D%20error_counts.into_iter%28%29.collect%28%29%3B%0A%20%20%20%20sorted_errors.sort_by%28%7Ca%2C%20b%7C%20b.1.cmp%28%26amp%3Ba.1%29%29%3B%0A%20%20%20%20stats.top_errors%20%3D%20sorted_errors.into_iter%28%29.take%285%29.collect%28%29%3B%0A%0A%20%20%20%20Ok%28stats%29%0A%7D%0A%0Afn%20main%28%29%20%7B%0A%20%20%20%20let%20args%3A%20Vec%26lt%3BString%26gt%3B%20%3D%20std%3A%3Aenv%3A%3Aargs%28%29.collect%28%29%3B%0A%20%20%20%20let%20unit%20%3D%20args.get%281%29.map%28%7Cs%7C%20s.as_str%28%29%29.unwrap_or%28%26quot%3Bnginx.service%26quot%3B%29%3B%0A%20%20%20%20let%20since%20%3D%20args.get%282%29.map%28%7Cs%7C%20s.as_str%28%29%29.unwrap_or%28%26quot%3B7%20days%20ago%26quot%3B%29%3B%0A%0A%20%20%20%20match%20analyze_journal%28unit%2C%20since%29%20%7B%0A%20%20%20%20%20%20%20%20Ok%28stats%29%20%3D%26gt%3B%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%94%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%97%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20Journal%20Analyzer%3A%20%7B%3A%26lt%3B23%7D%20%E2%95%91%26quot%3B%2C%20unit%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%A0%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%A3%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E6%97%A5%E5%BF%97%E6%80%BB%E6%95%B0%3A%20%7B%3A%26lt%3B30%7D%20%E2%95%91%26quot%3B%2C%20stats.total%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E9%94%99%E8%AF%AF%E6%95%B0%E9%87%8F%3A%20%7B%3A%26lt%3B30%7D%20%E2%95%91%26quot%3B%2C%20stats.errors%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E8%AD%A6%E5%91%8A%E6%95%B0%E9%87%8F%3A%20%7B%3A%26lt%3B30%7D%20%E2%95%91%26quot%3B%2C%20stats.warnings%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E9%87%8D%E5%90%AF%E6%AC%A1%E6%95%B0%3A%20%7B%3A%26lt%3B30%7D%20%E2%95%91%26quot%3B%2C%20stats.restarts%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20let%20Some%28ref%20time%29%20%3D%20stats.last_error_time%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20timestamp%20%3D%20time.parse%3A%3A%26lt%3Bi64%26gt%3B%28%29.unwrap_or%280%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20datetime%20%3D%20chrono%3A%3ANaiveDateTime%3A%3Afrom_timestamp%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timestamp%20/%201_000_000%2C%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%E6%9C%80%E5%90%8E%E9%94%99%E8%AF%AF%3A%20%7B%3A%26lt%3B30%7D%20%E2%95%91%26quot%3B%2C%20datetime%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%A0%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%A3%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20Top%20%E9%94%99%E8%AF%AF%3A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%95%91%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28i%2C%20%28msg%2C%20count%29%29%20in%20stats.top_errors.iter%28%29.enumerate%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20truncated%20%3D%20if%20msg.len%28%29%20%26gt%3B%2035%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20format%21%28%26quot%3B%7B%7D...%26quot%3B%2C%20%26amp%3Bmsg%5B..32%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg.clone%28%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%91%20%20%7B%7D.%20%7B%3A%26lt%3B35%7D%20x%7B%7D%20%E2%95%91%26quot%3B%2C%20i%20%2B%201%2C%20truncated%2C%20count%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20println%21%28%26quot%3B%E2%95%9A%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%90%E2%95%A3%26quot%3B%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20Err%28e%29%20%3D%26gt%3B%20eprintln%21%28%26quot%3B%E5%88%86%E6%9E%90%E5%A4%B1%E8%B4%A5%3A%20%7B%7D%26quot%3B%2C%20e%29%2C%0A%20%20%20%20%7D%0A%7D%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22_2%22%3E%E5%85%AB%E3%80%81%E7%94%9F%E4%BA%A7%E7%BA%A7%E9%83%A8%E7%BD%B2%E6%A8%A1%E6%9D%BF%E4%B8%8E%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%3C/h2%3E%0A%3Ch3%20id%3D%2281-web%22%3E8.1%20Web%20%E6%9C%8D%E5%8A%A1%E5%AE%8C%E6%95%B4%E6%A8%A1%E6%9D%BF%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/system/webapp%40%5B1-4%5D.service%40.service%20%28%E6%A8%A1%E6%9D%BF%E5%8D%95%E5%85%83%29%0A%5BUnit%5D%0ADescription%3DWeb%20Application%20Instance%20%25i%0AAfter%3Dnetwork-online.target%0AWants%3Dnetwork-online.target%0A%0A%5BService%5D%0AType%3Dnotify%0AUser%3Dwebapp%0AGroup%3Dwebapp%0A%0A%23%20%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%0AEnvironmentFile%3D/etc/webapp/%25i.env%0AEnvironment%3DNODE_ENV%3Dproduction%20PORT%3D%25i%0A%0A%23%20%E5%90%AF%E5%8A%A8%E5%91%BD%E4%BB%A4%0AExecStartPre%3D/usr/local/bin/webapp-migrate%0AExecStart%3D/usr/local/bin/webapp-start%0AExecReload%3D/bin/kill%20-HUP%20%24MAINPID%0AExecStop%3D/bin/kill%20-SIGTERM%20%24MAINPID%0A%0A%23%20%E9%87%8D%E5%90%AF%E7%AD%96%E7%95%A5%0ARestart%3Don-failure%0ARestartSec%3D5%0AStartLimitIntervalSec%3D60%0AStartLimitBurst%3D3%0A%0A%23%20%E8%B6%85%E6%97%B6%E9%85%8D%E7%BD%AE%0ATimeoutStartSec%3D30%0ATimeoutStopSec%3D15%0AWatchdogSec%3D30%0A%0A%23%20%E5%AE%89%E5%85%A8%E6%B2%99%E7%AE%B1%0APrivateTmp%3Dyes%0AProtectSystem%3Dstrict%0AProtectHome%3Dread-only%0AReadWritePaths%3D/var/lib/webapp/%25i%20/var/log/webapp/%25i%0ANoNewPrivileges%3Dyes%0APrivateDevices%3Dyes%0AMemoryDenyWriteExecute%3Dyes%0ARestrictNamespaces%3Dyes%0ARestrictAddressFamilies%3DAF_INET%20AF_INET6%20AF_UNIX%0ASystemCallFilter%3D%40system-service%0ALockPersonality%3Dyes%0A%0A%23%20%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%0ACPUQuota%3D80%25%0AMemoryMax%3D1G%0AMemoryHigh%3D800M%0ATasksMax%3D512%0AIOWeight%3D100%0A%0A%23%20%E6%97%A5%E5%BF%97%0AStandardOutput%3Djournal%0AStandardError%3Djournal%0ASyslogIdentifier%3Dwebapp-%25i%0A%0A%5BInstall%5D%0AWantedBy%3Dmulti-user.target%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2282%22%3E8.2%20%E6%9C%8D%E5%8A%A1%E5%8D%95%E5%85%83%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E4%B8%8E%E6%A0%A1%E9%AA%8C%3C/h3%3E%0A%3Cp%3E%E4%BD%BF%E7%94%A8%20%3Ccode%3Esystemd-analyze%3C/code%3E%20%E8%BF%9B%E8%A1%8C%E7%AB%AF%E5%88%B0%E7%AB%AF%E9%AA%8C%E8%AF%81%EF%BC%9A%3C/p%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-bash%22%3E%23%20%E6%A3%80%E6%9F%A5%E5%8D%95%E5%85%83%E6%96%87%E4%BB%B6%E8%AF%AD%E6%B3%95%0Asystemd-analyze%20verify%20/etc/systemd/system/webapp.service%0A%0A%23%20%E5%88%86%E6%9E%90%E5%90%AF%E5%8A%A8%E8%80%97%E6%97%B6%0Asystemd-analyze%20blame%0Asystemd-analyze%20critical-chain%20webapp.service%0A%0A%23%20%E5%AE%89%E5%85%A8%E8%AF%84%E5%88%86%E5%AE%A1%E8%AE%A1%EF%BC%88systemd%20249%2B%EF%BC%89%0Asystemd-analyze%20security%20webapp.service%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2283-systemd-analyze-security%22%3E8.3%20%E4%BD%BF%E7%94%A8%20systemd-analyze%20security%20%E8%BE%93%E5%87%BA%E8%A7%A3%E8%AF%BB%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3E%20%20%E2%9C%97%20PrivateDevices%3Dyes%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201.5%0A%20%20%20%20%E2%9E%9C%20Service%20should%20process%20its%20own%20device%20nodes%0A%0A%20%20%E2%9C%93%20MemoryDenyWriteExecute%3Dyes%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203.0%0A%20%20%20%20%E2%9C%93%20Service%20has%20W%5EX%20protection%20enabled%0A%0A%20%20%E2%9C%93%20NoNewPrivileges%3Dyes%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203.0%0A%20%20%20%20%E2%9C%93%20Service%20has%20NoNewPrivileges%20set%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%3Ccode%3Esystemd-analyze%20security%3C/code%3E%20%E8%BE%93%E5%87%BA%200%EF%BC%88%E5%AE%8C%E5%85%A8%E5%AE%89%E5%85%A8%EF%BC%89%E5%88%B0%2010%EF%BC%88%E5%AE%8C%E5%85%A8%E6%9A%B4%E9%9C%B2%EF%BC%89%E7%9A%84%E8%AF%84%E5%88%86%EF%BC%8C%E6%98%AF%E7%94%9F%E4%BA%A7%E9%83%A8%E7%BD%B2%E5%89%8D%E5%BF%85%E9%A1%BB%E8%BF%9B%E8%A1%8C%E7%9A%84%E6%A3%80%E6%9F%A5%E6%AD%A5%E9%AA%A4%E3%80%82%3C/p%3E%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22_3%22%3E%E4%B9%9D%E3%80%81%E4%B8%8E%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E7%BB%84%E4%BB%B6%E7%9A%84%E6%95%B4%E5%90%88%3C/h2%3E%0A%3Ch3%20id%3D%2291-systemd%22%3E9.1%20systemd%20%E4%B8%8E%E5%AE%B9%E5%99%A8%E8%BF%90%E8%A1%8C%E6%97%B6%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20%E5%9C%A8%E5%AE%B9%E5%99%A8%E5%86%85%E8%BF%90%E8%A1%8C%20systemd%20%E9%9C%80%E8%A6%81%E4%BB%A5%E4%B8%8B%E9%85%8D%E7%BD%AE%0A%23%20/etc/systemd/system/container.service%0A%5BService%5D%0A%23%20cgroup%20v2%20%E7%9A%84%E5%AE%B9%E5%99%A8%E5%8F%8B%E5%A5%BD%E9%85%8D%E7%BD%AE%0ADelegate%3Dyes%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3E%E5%9C%A8%20Docker/Podman%20%E4%B8%AD%E8%BF%90%E8%A1%8C%20systemd%20%E5%AE%B9%E5%99%A8%EF%BC%9A%3C/p%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-bash%22%3Epodman%20run%20-d%20--name%20systemd-demo%20%5C%0A%20%20--tmpfs%20/run%20%5C%0A%20%20--tmpfs%20/run/lock%20%5C%0A%20%20-v%20/sys/fs/cgroup%3A/sys/fs/cgroup%3Aro%20%5C%0A%20%20docker.io/library/centos%3A8%20/usr/sbin/init%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%2292-systemd-systemd-homed%22%3E9.2%20systemd%20%E4%B8%8E%20systemd-homed%EF%BC%88%E7%94%A8%E6%88%B7%E7%9B%AE%E5%BD%95%E7%AE%A1%E7%90%86%EF%BC%89%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-bash%22%3E%23%20%E5%88%9B%E5%BB%BA%E5%8A%A0%E5%AF%86%E7%9A%84%E7%94%A8%E6%88%B7%E8%B4%A6%E6%88%B7%0Ahomectl%20create%20alice%20--real-name%3D%26quot%3BAlice%20Chen%26quot%3B%20--storage%3Dluks%0A%0A%23%20%E6%9F%A5%E7%9C%8B%E7%94%A8%E6%88%B7%E7%8A%B6%E6%80%81%0Ahomectl%20inspect%20alice%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3Esystemd-homed%20%E6%8F%90%E4%BE%9B%E5%9F%BA%E4%BA%8E%20LUKS%20%E7%9A%84%E7%94%A8%E6%88%B7%E7%9B%AE%E5%BD%95%E5%8A%A0%E5%AF%86%EF%BC%8C%E6%94%AF%E6%8C%81%E7%99%BB%E5%BD%95%E6%97%B6%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD%E3%80%81%E6%B3%A8%E9%94%80%E5%90%8E%E8%87%AA%E5%8A%A8%E5%8D%B8%E8%BD%BD%EF%BC%8C%E6%AF%94%E4%BC%A0%E7%BB%9F%20ecryptfs%20%E6%9B%B4%E5%AE%89%E5%85%A8%E3%80%82%3C/p%3E%0A%3Ch3%20id%3D%2293-systemd-networkd-resolved%22%3E9.3%20systemd%20%E4%B8%8E%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE%EF%BC%88networkd%20%2B%20resolved%EF%BC%89%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-ini%22%3E%23%20/etc/systemd/network/20-wired.network%0A%5BMatch%5D%0AName%3Denp%2A%0A%0A%5BNetwork%5D%0ADHCP%3Dyes%0AIPv6AcceptRA%3Dyes%0A%0A%5BDHCPv4%5D%0AUseDNS%3Dyes%0AUseNTP%3Dyes%0A%0A%5BIPv6AcceptRA%5D%0AUseDNS%3Dyes%0A%3C/code%3E%3C/pre%3E%0A%0A%3Chr%20/%3E%0A%3Ch2%20id%3D%22_4%22%3E%E5%8D%81%E3%80%81%E6%80%BB%E7%BB%93%E4%B8%8E%E9%80%89%E5%9E%8B%E5%BB%BA%E8%AE%AE%3C/h2%3E%0A%3Ch3%20id%3D%22systemd_2%22%3E%E4%BD%95%E6%97%B6%E4%BD%BF%E7%94%A8%20systemd%20%E8%80%8C%E9%9D%9E%E5%85%B6%E4%BB%96%E6%96%B9%E6%A1%88%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%3E%E2%9C%85%20%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8%20systemd%20%E7%9A%84%E5%9C%BA%E6%99%AF%EF%BC%9A%0A%20%20%20%E2%80%A2%20%E5%8D%95%E4%BD%93%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%88%96%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E6%9C%8D%E5%8A%A1%E7%AE%A1%E7%90%86%0A%20%20%20%E2%80%A2%20%E9%9C%80%E8%A6%81%20socket%20activation%20%E7%9A%84%E6%8C%89%E9%9C%80%E5%90%AF%E5%8A%A8%0A%20%20%20%E2%80%A2%20%E4%B8%A5%E6%A0%BC%E7%9A%84%E8%B5%84%E6%BA%90%E9%9A%94%E7%A6%BB%E4%B8%8E%E5%AE%89%E5%85%A8%E6%B2%99%E7%AE%B1%E9%9C%80%E6%B1%82%0A%20%20%20%E2%80%A2%20%E5%AE%8C%E6%95%B4%E7%9A%84%E6%97%A5%E5%BF%97%E4%B8%8E%E7%9B%91%E6%8E%A7%E9%9B%86%E6%88%90%0A%20%20%20%E2%80%A2%20%E7%B3%BB%E7%BB%9F%E7%BA%A7%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%0A%0A%E2%9A%A0%EF%B8%8F%20%E8%80%83%E8%99%91%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%A1%88%E7%9A%84%E5%9C%BA%E6%99%AF%EF%BC%9A%0A%20%20%20%E2%80%A2%20Kubernetes%20Pod%20%E5%86%85%EF%BC%88%E6%8E%A7%E5%88%B6%E5%99%A8%E4%B8%BA%20kubelet%EF%BC%89%0A%20%20%20%E2%80%A2%20%E6%9E%81%E7%AE%80%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%EF%BC%88%E4%BD%BF%E7%94%A8%20s6/dumb-init%EF%BC%89%0A%20%20%20%E2%80%A2%20%E5%B5%8C%E5%85%A5%E5%BC%8F%20Linux%EF%BC%88%E4%BD%BF%E7%94%A8%20busybox%20init%EF%BC%89%0A%3C/code%3E%3C/pre%3E%0A%0A%3Ch3%20id%3D%22systemd_3%22%3Esystemd%20%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%3C/h3%3E%0A%3Cpre%20class%3D%22codehilite%22%3E%3Ccode%20class%3D%22language-bash%22%3E%23%20%E6%9C%8D%E5%8A%A1%E7%AE%A1%E7%90%86%0Asystemctl%20start%7Cstop%7Crestart%7Creload%7Cenable%7Cdisable%20%26lt%3Bservice%26gt%3B%0Asystemctl%20status%20%26lt%3Bservice%26gt%3B%0A%0A%23%20%E5%8D%95%E5%85%83%E6%8E%A9%E8%94%BD%EF%BC%88%E5%BD%BB%E5%BA%95%E7%A6%81%E7%94%A8%EF%BC%89%0Asystemctl%20mask%20%26lt%3Bservice%26gt%3B%0Asystemctl%20unmask%20%26lt%3Bservice%26gt%3B%0A%0A%23%20%E7%BC%96%E8%BE%91%E5%8D%95%E5%85%83%EF%BC%88%E8%87%AA%E5%8A%A8%E9%87%8D%E8%BD%BD%EF%BC%89%0Asystemctl%20edit%20%26lt%3Bservice%26gt%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%88%9B%E5%BB%BA%20drop-in%0Asystemctl%20edit%20--full%20%26lt%3Bservice%26gt%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E7%BC%96%E8%BE%91%E5%AE%8C%E6%95%B4%E5%8D%95%E5%85%83%0A%0A%23%20%E5%AE%9A%E6%97%B6%E5%99%A8%E5%92%8C%20Socket%0Asystemctl%20list-timers%20--all%0Asystemctl%20list-sockets%0A%0A%23%20%E8%B5%84%E6%BA%90%E6%9F%A5%E7%9C%8B%0Asystemctl%20show%20%26lt%3Bservice%26gt%3B%20--property%3DMainPID%2CMemoryCurrent%2CCPUUsageNSec%0Asystemd-cgtop%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%AE%9E%E6%97%B6%20cgroup%20%E7%9B%91%E6%8E%A7%0Asystemd-cgls%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20cgroup%20%E5%B1%82%E7%BA%A7%E6%A0%91%0A%0A%23%20%E6%97%A5%E5%BF%97%0Ajournalctl%20-f%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%AE%9E%E6%97%B6%E8%B7%9F%E8%B8%AA%0Ajournalctl%20--disk-usage%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%97%A5%E5%BF%97%E5%8D%A0%E7%94%A8%0Ajournalctl%20--vacuum-size%3D100M%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E9%99%90%E5%88%B6%E5%A4%A7%E5%B0%8F%0Ajournalctl%20--verify%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%AE%8C%E6%95%B4%E6%80%A7%E6%A0%A1%E9%AA%8C%0A%3C/code%3E%3C/pre%3E%0A%0A%3Cp%3Esystemd%20%E7%BB%8F%E8%BF%87%E5%8D%81%E4%BD%99%E5%B9%B4%E5%8F%91%E5%B1%95%EF%BC%8C%E5%B7%B2%E4%B8%8D%E5%86%8D%E6%98%AF%E7%AE%80%E5%8D%95%E7%9A%84%20init%20%E8%BF%9B%E7%A8%8B%E6%9B%BF%E4%BB%A3%E5%93%81%EF%BC%8C%E8%80%8C%E6%98%AF%E4%B8%80%E5%A5%97%E5%AE%8C%E6%95%B4%E7%9A%84%E6%9C%8D%E5%8A%A1%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E3%80%82%E6%8E%8C%E6%8F%A1%E5%85%B6%E9%AB%98%E7%BA%A7%E7%89%B9%E6%80%A7%EF%BC%8C%E8%83%BD%E5%A4%9F%E6%98%BE%E8%91%97%E6%8F%90%E5%8D%87%20Linux%20%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%8F%AF%E9%9D%A0%E6%80%A7%E3%80%81%E5%AE%89%E5%85%A8%E6%80%A7%E5%92%8C%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7%E3%80%82%E5%9C%A8%E5%AE%B9%E5%99%A8%E5%8C%96%E6%97%B6%E4%BB%A3%EF%BC%8Csystemd%20%E7%9A%84%E4%BB%B7%E5%80%BC%E5%B9%B6%E6%9C%AA%E6%B6%88%E9%80%80%E2%80%94%E2%80%94%E5%8F%8D%E8%80%8C%E5%9C%A8%20cgroups%20v2%20%E7%BB%9F%E4%B8%80%E3%80%81%E5%AE%89%E5%85%A8%E6%B2%99%E7%AE%B1%E7%B2%BE%E7%BB%86%E5%8C%96%E3%80%81bare-metal%20%E9%AB%98%E6%80%A7%E8%83%BD%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2%E7%AD%89%E5%9C%BA%E6%99%AF%E4%B8%AD%E6%8C%81%E7%BB%AD%E5%8F%91%E6%8C%A5%E6%A0%B8%E5%BF%83%E4%BD%9C%E7%94%A8%E3%80%82%3C/p%3E%3C/body%3E%3C/html%3E
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部