{
    "componentChunkName": "component---src-templates-issues-tsx",
    "path": "/issues/423",
    "result": {"data":{"issuesJson":{"id":"8feb1b76-eb1d-50d1-8b0e-b45258a68fa4","title":"deajan/osync: 基于 rsync 的强大双向（双向）文件同步脚本，具有容错功能、POSIX ACL 支持、时间控制和近实时同步","number":423,"bodyHTML":"<div align=\"center\" dir=\"auto\">\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a><br><br></p>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th align=\"right\">Repos</th>\n<th align=\"left\"><a href=\"https://github.com/deajan/osync\">deajan/osync</a></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"right\"><strong>Views</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/fb07fb96467f7aedd758a5454da117493fffd2a4fd9c5f2aa714a1a7d36a59ea/68747470733a2f2f76696577732e77686174696c656172656e65642e746f6461792f76696577732f6769746875622f6465616a616e2f6f73796e632e737667\" alt=\"views\" data-canonical-src=\"https://views.whatilearened.today/views/github/deajan/osync.svg\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Stars</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/aa940b00e6b52c87e641898e8348a576535d6b14dc8ed6aea7967304ed52d479/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6465616a616e2f6f73796e633f636f6c6f723d663266303864266c6f676f3d556e64657274616c65266c6f676f436f6c6f723d656234363330\" alt=\"stars\" data-canonical-src=\"https://img.shields.io/github/stars/deajan/osync?color=f2f08d&amp;logo=Undertale&amp;logoColor=eb4630\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Forks</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/6852a512bd384db217d405a56ba552d8933cdb55212d129a529028a0432670b1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f6465616a616e2f6f73796e633f636f6c6f723d626138366562266c6f676f3d48616e647368616b65266c6f676f436f6c6f723d656136616136\" alt=\"forks\" data-canonical-src=\"https://img.shields.io/github/forks/deajan/osync?color=ba86eb&amp;logo=Handshake&amp;logoColor=ea6aa6\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>License</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/0d9e72ed9872afe5767b32908a256ba077288f900544f56ea490be9ca740287f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6465616a616e2f6f73796e633f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e53556845556741414144414141414177434159414141425841766d48414141414358424957584d41414173544141414c457745416d70775941414144336b6c45515652346e4f335953557a5555426748384a726f57567255474a66456d3773584e63534446784d544c327069347348456778654e526f77586770455742445552522532424e414e4f4b4f4b36366f6f4b4a4742586545475263574163455646475152484677516d483525324630774861655748493944554455354c356b6e6568644f62377a66652532423139636e434a47495243516945596c514237594a4979474c38616f73756c565a36695246516a69474b6b7564576735614c6c704f70704e586e665071773555304459524a6d56786a4367464633424c755a476d416f5655694b4541726d583744375553677351706f72674761336748664b34483663754262435644334771683141352532424c6745253242467749656e514d306a6f446f66714c6f48564e7742796d384370546e416d327a51713073676478624964515a556c416b7150415a3664676a303541446f59526f6f66792532466f5869726f376b3551586a4c6f70677a4b69514e6c4c4461716f4967754577426a7a7150355066446a45394479495879493633464d547751464d43567271774e61763451666f52673538514625324266724d485172454b3844546f434d714e4179574e4866786d54526f4c4f726d5352566747744466714345715a4f4851727a6f34706243557341333431365169364551394b476a6345465267484f724f4b6e5536574162396247455459656b4b7843766a546167394534706a653534446b3551503862624d4859762532464333756541654a6b50304f4778422532424a70426e4172595238455951516e6f4e31414e4661426e5050356c385372736559514c303641646b30464a5938484f5761424d6c6541486a683068506f73497a6c6f3876304125324633345a694f6548726130714b52504d5653493774762532423932747725324676687855654252713456454c674d376642714b354770526d6f514c584e7075625475367a6f4e52706754386e5051627138347764253246494375767978694b4871694e41664933774d367549684271476b4c696977414f734b44714f68743749747239567938536a52424557667941627225324668523142667056514664484a42253246423268683778376a36517077435665655951326b72554235436c636a3641326d3067576a25324244306d4c34397a573563517943484c4e37726a6c6d6d6174457958582532464372547a412532466f51785a6b576c39474a5443566f25324279546a3837253242346769504b6376307149486f344156344430565a727251493334706e70524d36357875652532467a417265453425324654253246536f676c664542794d7369517441546c4c3352414a355948725378365a44665337307337754d486842705225324659423573305057366f455270316236253246667252684b3353444c35546965364f515548516c5133735644752532427a50636b397657453973747225324236496a533967486d5750616861444a25324277434b364e494242587348423948796b587378774470686c436d416476706c6162554a4e6e5a504239342532464e7436784f6538587a4562503257684d335741673147756236744825324233513150673337365239713475716c6e6f36676448476a444f5139306562303141484d3672596975554a314f713472344656756a35765239427a4d3957674e764f7977446869495951467667626366774166774d764863615067425041253246447948476a50624e394138616d6562636477416444354e6633373574787165774e5552656f797677424958594c645170576c6877465771745061435044334173467541535636717171496c62304a766b564331464c39576b4c55556c55574b337a585a4c46432532423125324642726f46746f364f7358497545594a5034447a7a5732594656316f4a614141414141456c46546b5375516d4343\" alt=\"license\" data-canonical-src=\"https://img.shields.io/github/license/deajan/osync?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD3klEQVR4nO3YSUzUUBgH8JroWVrUGJfEm7sXNcSDFxMTL2pi4sHEgxeNRowXgpEWBDURR%2BNANOKOK66ooKJGBXeEGRcWAcEVFGQRHFwQmH5%2F0wHaeWHI9DUDU5L5knehdOb7zfe%2B19cnCJGIRCQiEYlQB7YJIyGL8aosulVZ6iRFQjiGKkudWg5aLlpOppNXnfPqw5U0DYRJmVxjCgFF3BLuZGmAoVUiKEArmX7D7USgsQporgGa3gHfK4H6cuBbCVD3Gqh1A5%2BLgE%2BFwIenQM0joDofqLoHVNwBym8CpTnAm2zQq0sgdxbIdQZUlAkqPAZ6dgj05ADoYRoofy%2FoXiro7k5QXjLopgzKiQNlLDaqoIguEwBjzqP5PfDjE9DyIXyI63FMTwQFMCVrqwNav4QfoRg58QF%2BfrMHQrEK8DToCMqNAyWNHfxmTRoLOrmSRVgGtDfqCEqZOHQrzo4pbCUsA3416Qi6EQ9KGjcEFRgHOrOKnU6WAb9bGETYekKxCvjTag9E4pje54Dk5QP8bbMHYv%2FC3ueAeJkP0OGxB%2BJpBnArYR8EYQQnoN1ANFaBnPP5l8SrseYQL06Adk0FJY8HOWaBMleAHjh0hPosIzlo8v0A%2F34ZiOeHra0qKRPMVSI7tv%2B92tw%2FvhxUeBRq4VELgM7fBqK5GpRmoQLXNpubTu6zoNRpgT8nPQbq84wd%2FICuvyxiKHqiNAfI3wM6uIhBqGkLiiwAOsKDqOht7Itr9Vy8SjRBEWfyAbr%2FhR1BfpVQFdHJB%2FB2hh7x7j6QpwCVeeYQ2krUB5Clcj6A2m0gWj%2BD0mL49zW5cQyCHLN7rjlmmatEyXX%2FCrTzA%2FoQxZkWl9GJTCVo%2ByTj87%2B4giPKcv0qIHo4AV4D0VZrrQI34pnpRM65xue%2FzAreE4%2FT%2FSoglfEByMsiQtATlL3RAJ5YHrSx6ZDfS70s7uMHhBpR%2FYB5s0PW6oERp1b6%2FfrRhK3SDL5Tie6OQUHQlQ3sVDu%2BzPck9vWE9str%2B6IjS9gHmWPahaDJ%2BwCK6NIBBXsHB9HykXsxwDphlCmAdvplabUJNnZPB94%2FNt6xOe8XzEbP2WhM3WAg1Gub6tH%2B3Q1Pg376R9q4uqlno6gdHGjDOQ90eb01AHM6rYiuUJ1Oq4r4FVuj5vR9BzM9WgNvOywDhiIYQFvgbcfwAfwMvHcaPgBPA%2FDyHGjPbN9A8amebcdwAdD5Nf375txqewNUReoyvwBIXYLdQpWlhwFWqtPaCPD3AsFuASV6qqqIlb0JvkVC1FL9WkLUUlUWK3zXZLFC%2B1%2FBroFto6OsXIuEYJP4DzzW2YFV1oJaAAAAAElFTkSuQmCC\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>UpdatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/f1f43914b6e414b03ac715dc3cc34ddb5ff1446ef489ed703dba66e3d239d261/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6465616a616e2f6f73796e633f646973706c61795f74696d657374616d703d636f6d6d6974746572266c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d557064617465644174\" alt=\"last-commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/deajan/osync?display_timestamp=committer&amp;logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=UpdatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>CreatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/3f159163660a92ac2b4822b34d7b0ab54d47924ae2a132bdd969e0245f0281ab/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f637265617465642d61742f6465616a616e2f6f73796e633f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d437265617465644174\" alt=\"create-at\" data-canonical-src=\"https://img.shields.io/github/created-at/deajan/osync?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=CreatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<a href=\"https://github.com/opsre/awesome-ops\">\n</a><p dir=\"auto\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/b964a36ea4078c39f603d46a29436371c7541a2f26e0228d7b21b9d9805b43d3/68747470733a2f2f736f6369616c6966792e6769742e63692f6f707372652f617765736f6d652d6f70732f696d6167653f6465736372697074696f6e3d3126666f6e743d42697474657226666f726b733d31266973737565733d31266c616e67756167653d31266c6f676f3d6874747073253341253246253246617661746172732e67697468756275736572636f6e74656e742e636f6d25324675253246313838353638303230266e616d653d31266f776e65723d31267061747465726e3d436972637569742b426f6172642670756c6c733d31267374617267617a6572733d31267468656d653d4c69676874\" alt=\"\" data-canonical-src=\"https://socialify.git.ci/opsre/awesome-ops/image?description=1&amp;font=Bitter&amp;forks=1&amp;issues=1&amp;language=1&amp;logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F188568020&amp;name=1&amp;owner=1&amp;pattern=Circuit+Board&amp;pulls=1&amp;stargazers=1&amp;theme=Light\" style=\"max-width: 100%;\"></a></p>\n<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a>\n</div>\n<h1 dir=\"auto\">osync</h1>\n<p dir=\"auto\"><a href=\"https://opensource.org/licenses/BSD-3-Clause\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/439fd5ffe2ac21b3daa03ac6474978163be089da5fbba2790769ae2275464e35/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d425344253230332d2d436c617573652d626c75652e737667\" alt=\"License\" data-canonical-src=\"https://img.shields.io/badge/License-BSD%203--Clause-blue.svg\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://github.com/deajan/osync/releases/latest\"><img src=\"https://camo.githubusercontent.com/b1b38497e5a50ef9123c0875d2dcf2efa0ddf5656f941807a8bf089842af516c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f6465616a616e2f6f73796e632e7376673f6c6162656c3d4c6174657374\" alt=\"GitHub Release\" data-canonical-src=\"https://img.shields.io/github/release/deajan/osync.svg?label=Latest\" style=\"max-width: 100%;\"></a><br>\n<a href=\"http://isitmaintained.com/project/deajan/osync\" title=\"Percentage of issues still open\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/cb5cc58ab0623821eef384f85f30d44d1981d91e41dd0c765842bd7902446b39/687474703a2f2f697369746d61696e7461696e65642e636f6d2f62616467652f6f70656e2f6465616a616e2f6f73796e632e737667\" alt=\"Percentage of issues still open\" data-canonical-src=\"http://isitmaintained.com/badge/open/deajan/osync.svg\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://www.codacy.com/app/ozy/osync?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=deajan/osync&amp;utm_campaign=Badge_Grade\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/bd01fd0a4a9196053715a1674889120f4a08ca434be1019b250b115850e7d831/68747470733a2f2f6170692e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f3635316163623266643634363432656239313037386261353233623766383837\" alt=\"Codacy Badge\" data-canonical-src=\"https://api.codacy.com/project/badge/Grade/651acb2fd64642eb91078ba523b7f887\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://github.com/deajan/osync/actions/workflows/linux.yml/badge.svg\"><img src=\"https://github.com/deajan/osync/actions/workflows/linux.yml/badge.svg\" alt=\"linux tests\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://github.com/deajan/osync/actions/workflows/windows.yml/badge.svg\"><img src=\"https://github.com/deajan/osync/actions/workflows/windows.yml/badge.svg\" alt=\"windows tests\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://github.com/deajan/osync/actions/workflows/macos.yml/badge.svg\"><img src=\"https://github.com/deajan/osync/actions/workflows/macos.yml/badge.svg\" alt=\"macos tests\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\">A two way filesync script running on bash Linux, BSD, Android, MacOSX, Cygwin, MSYS2, Win10 bash and virtually any system supporting bash.<br>\nFile synchronization is bidirectional, and can be run manually, as scheduled task, or triggered on file changes in monitor mode.<br>\nIt is a command line tool rsync wrapper with a lot of additional features baked in.</p>\n<p dir=\"auto\">This is a quickstart guide, you can find the full documentation on the <a href=\"http://www.netpower.fr/osync\" rel=\"nofollow\">author's site</a>.</p>\n<h2 dir=\"auto\">About</h2>\n<p dir=\"auto\">osync provides the following capabilities:</p>\n<ul dir=\"auto\">\n<li>Local-Local and Local-Remote sync</li>\n<li>Fault tolerance with resume scenarios</li>\n<li>POSIX ACL and extended attributes synchronization</li>\n<li>Full script Time control</li>\n<li>Soft deletions and multiple backups handling</li>\n<li>Before/after run command execution</li>\n<li>Email alerts</li>\n<li>Logging facility</li>\n<li>Directory monitoring</li>\n<li>Running on schedule or as daemon</li>\n<li>Batch runner for multiple sync tasks with rerun option for failed sync tasks</li>\n</ul>\n<p dir=\"auto\">osync is a stateful synchronizer. This means it's agentless and doesn't have to monitor files for changes. Instead, it compares replica file lists between two runs.<br>\nA full run takes about 2 seconds on a local-local replication and about 7 seconds on a local-remote replication.<br>\nDisabling some features file like attributes preservation and disk space checks may speed up execution.<br>\nosync uses a initiator/target sync schema. It can sync local to local or local to remote directories. By definition, initiator replica is always a local directory on the system osync runs on.<br>\nosync uses pidlocks to prevent multiple concurrent sync processes on/to the same initiator/target replica.<br>\nYou may launch concurrent sync processes on the same system but as long as the replicas to synchronize are different.<br>\nMultiple osync tasks may be launched sequentially by osync osync-batch tool.</p>\n<h2 dir=\"auto\">Tested platforms</h2>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th>Operating system</th>\n<th>Version</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>AlmaLinux</td>\n<td>9</td>\n</tr>\n<tr>\n<td>Android*</td>\n<td>Not known</td>\n</tr>\n<tr>\n<td>CentOS</td>\n<td>5.x, 6.x, 7.x</td>\n</tr>\n<tr>\n<td>Fedora</td>\n<td>22-25</td>\n</tr>\n<tr>\n<td>FreeBSD</td>\n<td>8.3-11</td>\n</tr>\n<tr>\n<td>Debian</td>\n<td>6-11</td>\n</tr>\n<tr>\n<td>Linux Mint</td>\n<td>14-18</td>\n</tr>\n<tr>\n<td>macOS</td>\n<td>Not known</td>\n</tr>\n<tr>\n<td>pfSense</td>\n<td>2.3.x</td>\n</tr>\n<tr>\n<td>QTS (x86)</td>\n<td>4.5.1</td>\n</tr>\n<tr>\n<td>Ubuntu</td>\n<td>12.04-22.04</td>\n</tr>\n<tr>\n<td>Windows**</td>\n<td>10</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<p dir=\"auto\">* via Termux.<br>\n** via MSYS, Cygwin and WSL.</p>\n<p dir=\"auto\">Some users also have successfully used osync on Gentoo and created an OpenRC init script for it.</p>\n<h2 dir=\"auto\">Installation</h2>\n<p dir=\"auto\">osync has been designed to not delete any data, but rather make backups of conflictual files or soft deletes.<br>\nNevertheless, you should always have a neat backup of your data before trying a new sync tool.</p>\n<p dir=\"auto\">Getting osync via GitHub (remove the -b \"stable\" if you want latest dev snapshot)</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ git clone -b &quot;stable&quot; https://github.com/deajan/osync\n$ cd osync\n$ bash install.sh\"><pre class=\"notranslate\"><code class=\"notranslate\">$ git clone -b \"stable\" https://github.com/deajan/osync\n$ cd osync\n$ bash install.sh\n</code></pre></div>\n<p dir=\"auto\">Installer script accepts some parameters for automation. Launch install.sh --help for options.</p>\n<p dir=\"auto\">There is also an RPM file that should fit RHEL/CentOS/Fedora and basically any RPM based distro, see the GitHub release.<br>\nPlease note that RPM files will install osync to <code class=\"notranslate\">/usr/bin</code> instead of <code class=\"notranslate\">/usr/local/bin</code> in order to enforce good practices.</p>\n<p dir=\"auto\">osync will install itself to <code class=\"notranslate\">/usr/local/bin</code> and an example configuration file will be installed to <code class=\"notranslate\">/etc/osync</code>.</p>\n<p dir=\"auto\">osync needs to run with bash shell. Using any other shell will most probably result in errors.<br>\nIf bash is not your default shell, you may invoke it using</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ bash osync.sh [options]\"><pre class=\"notranslate\"><code class=\"notranslate\">$ bash osync.sh [options]\n</code></pre></div>\n<p dir=\"auto\">On *BSD and BusyBox, be sure to have bash installed.</p>\n<p dir=\"auto\">If you can't install osync, you may just copy osync.sh where you needed and run it from there.</p>\n<p dir=\"auto\">Arch Linux packages are available at <a href=\"https://aur.archlinux.org/packages/osync/\" rel=\"nofollow\">https://aur.archlinux.org/packages/osync/</a> (thanks to Shadowigor, <a href=\"https://github.com/shadowigor\">https://github.com/shadowigor</a>).</p>\n<h2 dir=\"auto\">Upgrade from previous configuration files</h2>\n<p dir=\"auto\">Since osync v1.1 the config file format has changed in semantics and adds new config options.<br>\nAlso, master is now called initiator and slave is now called target.<br>\nosync v1.3 also added multiple new configuration options.</p>\n<p dir=\"auto\">You can upgrade all v1.0x-v1.3-dev config files by running the upgrade script</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ ./upgrade-v1.0x-v1.3x.sh /etc/osync/your-config-file.conf\"><pre class=\"notranslate\"><code class=\"notranslate\">$ ./upgrade-v1.0x-v1.3x.sh /etc/osync/your-config-file.conf\n</code></pre></div>\n<p dir=\"auto\">The script will backup your config file, update it's content and try to connect to initiator and target replicas to update the state dir.</p>\n<h2 dir=\"auto\">Usage</h2>\n<p dir=\"auto\">Osync can work in 3 modes:</p>\n<ol dir=\"auto\">\n<li><a href=\"#quick-sync-mode\">🚀 Quick sync mode</a></li>\n<li><a href=\"#configuration-file-mode\">⚙️ Configuration file mode</a></li>\n<li><a href=\"#monitor-mode\">🔎 Monitor mode</a></li>\n</ol>\n<div class=\"markdown-alert markdown-alert-note\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-info mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path></svg>Note</p><p dir=\"auto\">Please use double quotes as path delimiters. Do not use escaped characters in path names.</p>\n</div>\n<h3 dir=\"auto\"><a id=\"user-content-quick-sync-mode\"></a>🚀 Quick sync mode</h3>\n<p dir=\"auto\">Quick sync mode is convenient to do fast syncs between some directories. However, the <a href=\"#configuration-file-mode\">configuration file mode</a> gives much more functionality.</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync.sh --initiator=&quot;/path/to/dir1&quot; --target=&quot;/path/to/remote dir2&quot;\n# osync.sh --initiator=&quot;/path/to/another dir&quot; --target=&quot;ssh://user@host.com:22//path/to/dir2&quot; --rsakey=/home/user/.ssh/id_rsa_private_key_example.com\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync.sh --initiator=\"/path/to/dir1\" --target=\"/path/to/remote dir2\"\n# osync.sh --initiator=\"/path/to/another dir\" --target=\"ssh://user@host.com:22//path/to/dir2\" --rsakey=/home/user/.ssh/id_rsa_private_key_example.com\n</code></pre></div>\n<h4 dir=\"auto\">Quick sync with minimal options</h4>\n<p dir=\"auto\">In order to run osync the quickest (without transferring file attributes, without softdeletion, without prior space checks and without remote connectivity checks, you may use the following:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# MINIMUM_SPACE=0 PRESERVE_ACL=no PRESERVE_XATTR=no SOFT_DELETE_DAYS=0 CONFLICT_BACKUP_DAYS=0 REMOTE_HOST_PING=no osync.sh --initiator=&quot;/path/to/another dir&quot; --target=&quot;ssh://user@host.com:22//path/to/dir2&quot; --rsakey=/home/user/.ssh/id_rsa_private_key_example.com\"><pre class=\"notranslate\"><code class=\"notranslate\"># MINIMUM_SPACE=0 PRESERVE_ACL=no PRESERVE_XATTR=no SOFT_DELETE_DAYS=0 CONFLICT_BACKUP_DAYS=0 REMOTE_HOST_PING=no osync.sh --initiator=\"/path/to/another dir\" --target=\"ssh://user@host.com:22//path/to/dir2\" --rsakey=/home/user/.ssh/id_rsa_private_key_example.com\n</code></pre></div>\n<p dir=\"auto\">All the settings described here may also be configured in the conf file.</p>\n<h3 dir=\"auto\">Summary mode</h3>\n<p dir=\"auto\">osync will output only file changes and errors with the following:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync.sh --initiator=&quot;/path/to/dir1&quot; --target=&quot;/path/to/dir&quot; --summary --errors-only --no-prefix\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync.sh --initiator=\"/path/to/dir1\" --target=\"/path/to/dir\" --summary --errors-only --no-prefix\n</code></pre></div>\n<p dir=\"auto\">This also works in configuration file mode.</p>\n<h3 dir=\"auto\"><a id=\"user-content-configuration-file-mode\"></a>⚙️ Configuration file mode</h3>\n<p dir=\"auto\">You'll have to customize the <code class=\"notranslate\">sync.conf</code> file according to your needs.</p>\n<p dir=\"auto\">If you intend to sync a remote directory, osync will need a pair of private/public RSA keys to perform remote SSH connections. Also, running sync as superuser requires to configure the <code class=\"notranslate\">/etc/sudoers</code> file.</p>\n<div class=\"markdown-alert markdown-alert-tip\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-light-bulb mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z\"></path></svg>Tip</p><p dir=\"auto\">Read the <a href=\"https://github.com/deajan/osync/blob/master/sync.conf.example\">example configuration file</a> for documentation about remote sync setups.</p>\n</div>\n<p dir=\"auto\">Once you've customized a <code class=\"notranslate\">sync.conf</code> file, you may run osync with the following test run:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync.sh /path/to/your.conf --dry\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync.sh /path/to/your.conf --dry\n</code></pre></div>\n<p dir=\"auto\">If everything went well, you may run the actual configuration with:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync.sh /path/to/your.conf\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync.sh /path/to/your.conf\n</code></pre></div>\n<p dir=\"auto\">To display which files and attrs are actually synchronized and which files are to be soft deleted / are in conflict, use <code class=\"notranslate\">--verbose</code> (you may mix it with <code class=\"notranslate\">--silent</code> to output verbose input only in the log files):</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync.sh /path/to/your.conf --verbose\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync.sh /path/to/your.conf --verbose\n</code></pre></div>\n<p dir=\"auto\">Use <code class=\"notranslate\">--no-maxtime</code> to disable execution time checks, which is usefull for big initial sync tasks that might take long time. Next runs should then only propagate changes and take much less time:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync.sh /path/to/your.conf --no-maxtime\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync.sh /path/to/your.conf --no-maxtime\n</code></pre></div>\n<p dir=\"auto\">Once you're confident about your first runs, you may add osync as a cron task like the following in <code class=\"notranslate\">/etc/crontab</code> which would run osync every 30 minutes:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"*/30 * * * * root /usr/local/bin/osync.sh /etc/osync/my_sync.conf --silent\"><pre class=\"notranslate\"><code class=\"notranslate\">*/30 * * * * root /usr/local/bin/osync.sh /etc/osync/my_sync.conf --silent\n</code></pre></div>\n<p dir=\"auto\">Please note that this syntax works for RedHat/CentOS. On Debian you might want to remove the username (i.e. root) in order to make the crontab entry work.</p>\n<h3 dir=\"auto\">Batch mode</h3>\n<p dir=\"auto\">You may want to sequentially run multiple sync sets between the same servers. In that case, <code class=\"notranslate\">osync-batch.sh</code> is a nice tool that will run every osync conf file, and, if a task fails,<br>\nrun it again if there's still some time left.</p>\n<p dir=\"auto\">To run all <code class=\"notranslate\">.conf</code> files found in <code class=\"notranslate\">/etc/osync</code>, and retry 3 times every configuration that fails if the whole sequential run took less than 2 hours, use:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync-batch.sh --path=/etc/osync --max-retries=3 --max-exec-time=7200\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync-batch.sh --path=/etc/osync --max-retries=3 --max-exec-time=7200\n</code></pre></div>\n<p dir=\"auto\">Having multiple conf files can then be run in a single cron command like</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"00 00 * * * root /usr/local/bin/osync-batch.sh --path=/etc/osync --silent\"><pre class=\"notranslate\"><code class=\"notranslate\">00 00 * * * root /usr/local/bin/osync-batch.sh --path=/etc/osync --silent\n</code></pre></div>\n<h3 dir=\"auto\"><a id=\"user-content-monitor-mode\"></a>🔎 Monitor mode</h3>\n<div class=\"markdown-alert markdown-alert-note\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-info mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path></svg>Note</p><p dir=\"auto\">Monitoring changes requires inotifywait command (<code class=\"notranslate\">inotify-tools</code> package for most Linux distributions). BSD, macOS and Windows are not yet supported for this operation mode, unless you find an <code class=\"notranslate\">inotify-tool</code> package on these OSes.</p>\n</div>\n<p dir=\"auto\">Monitor mode will perform a sync upon file operations on initiator replica. This can be a drawback on functionality versus scheduled mode because this mode only launches a sync task if there are file modifications on the initiator replica, without being able to monitor the target replica. Target replica changes are only synced when initiator replica changes occur, or when a given amount of time (600 seconds by default) passed without any changes on initiator replica.</p>\n<p dir=\"auto\">This mode can also be launched as a daemon with an init script. Please read the documentation for more info.</p>\n<p dir=\"auto\">To use this mode, use <code class=\"notranslate\">--on-changes</code>:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# osync.sh /etc/osync/my_sync.conf --on-changes\"><pre class=\"notranslate\"><code class=\"notranslate\"># osync.sh /etc/osync/my_sync.conf --on-changes\n</code></pre></div>\n<p dir=\"auto\">To run this mode as a system service with the <code class=\"notranslate\">osync-srv</code> script, you can run the <code class=\"notranslate\">install.sh</code> script (which should work in most cases) or copy the files by hand:</p>\n<ul dir=\"auto\">\n<li><code class=\"notranslate\">osync.sh</code> to <code class=\"notranslate\">/usr/bin/local</code></li>\n<li><code class=\"notranslate\">sync.conf</code> to <code class=\"notranslate\">/etc/osync</code></li>\n<li>For InitV, <code class=\"notranslate\">osync-srv</code> to <code class=\"notranslate\">/etc/init.d</code></li>\n<li>For systemd, <code class=\"notranslate\">osync-srv@.service</code> to <code class=\"notranslate\">/usr/lib/systemd/system</code></li>\n<li>For OpenRC, <code class=\"notranslate\">osync-srv-openrc</code> to <code class=\"notranslate\">/etc/init.d/osync-srv-openrc</code></li>\n</ul>\n<p dir=\"auto\">For InitV (any configuration file found in <code class=\"notranslate\">/etc/osync</code> will create an osync daemon instance when service is launched on initV):</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ service osync-srv start\n$ chkconfig osync-srv on\"><pre class=\"notranslate\"><code class=\"notranslate\">$ service osync-srv start\n$ chkconfig osync-srv on\n</code></pre></div>\n<p dir=\"auto\">For systemd, launch service (one service per config file to launch) with:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ systemctl start osync-srv@configfile.conf\n$ systemctl enable osync-srv@configfile.conf\"><pre class=\"notranslate\"><code class=\"notranslate\">$ systemctl start osync-srv@configfile.conf\n$ systemctl enable osync-srv@configfile.conf\n</code></pre></div>\n<p dir=\"auto\">For OpenRC (user contrib), launch service (one service per config file to launch) with:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ rc-update add osync-srv.configfile default\"><pre class=\"notranslate\"><code class=\"notranslate\">$ rc-update add osync-srv.configfile default\n</code></pre></div>\n<h2 dir=\"auto\">Security enhancements</h2>\n<p dir=\"auto\">Remote SSH connection security can be improved by limiting what hostnames may connect, disabling some SSH options and using ssh filter.<br>\nPlease read full documentation in order to configure ssh filter.</p>\n<h2 dir=\"auto\">Contributions</h2>\n<p dir=\"auto\">All kind of contribs are welcome.</p>\n<p dir=\"auto\">When submitting a PR, please be sure to modify files in dev directory (<code class=\"notranslate\">dev/n_osync.sh</code>, <code class=\"notranslate\">dev/ofunctions.sh</code>, <code class=\"notranslate\">dev/common_install.sh etc</code>) as most of the main files are generated via merge.sh.<br>\nWhen testing your contribs, generate files via merge.sh or use bootstrap.sh which generates a temporary version of n_osync.sh with all includes.</p>\n<p dir=\"auto\">Unit tests are run by travis on every PR, but you may also run them manually which adds some tests that travis can't do, via <code class=\"notranslate\">dev/tests/run_tests.sh</code>.<br>\nSSH port can be changed on the fly via environment variable SSH_PORT, e.g.:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# SSH_PORT=2222 dev/tests/run_tests.sh\"><pre class=\"notranslate\"><code class=\"notranslate\"># SSH_PORT=2222 dev/tests/run_tests.sh\n</code></pre></div>\n<p dir=\"auto\">Consider reading CODING_CONVENTIONS.TXT before submitting a patch.</p>\n<h2 dir=\"auto\">Troubleshooting</h2>\n<p dir=\"auto\">You may find osync's logs in <code class=\"notranslate\">/var/log/osync.[INSTANCE_ID].log</code> (or current directory if <code class=\"notranslate\">/var/log</code> is not writable).<br>\nAdditionnaly, you can use the --verbose flag see to what actions are going on.</p>\n<p dir=\"auto\">When opening an issue, please post the corresponding log files. Also, you may run osync with _DEBUG option in order to have more precise logs, e.g.:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"# _DEBUG=yes ./osync.sh /path/to/conf\"><pre class=\"notranslate\"><code class=\"notranslate\"># _DEBUG=yes ./osync.sh /path/to/conf\n</code></pre></div>\n<h2 dir=\"auto\">Uninstalling</h2>\n<p dir=\"auto\">The installer script also has an uninstall mode that will keep configuration files. Use it with</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ ./install.sh --remove\"><pre class=\"notranslate\"><code class=\"notranslate\">$ ./install.sh --remove\n</code></pre></div>\n<h2 dir=\"auto\">Author</h2>\n<p dir=\"auto\">Feel free to open an issue on GitHub or mail me for support in my spare time :)<br>\nOrsiris de Jong | <a href=\"mailto:ozy@netpower.fr\">ozy@netpower.fr</a></p>","updatedAt":"2025-05-21T16:14:56Z","upvoteCount":null,"author":{"login":"eryajf","avatarUrl":"https://avatars.githubusercontent.com/u/33259379?u=e4a4090a38ac2473aaed4ef9945233636776c6c3&v=4","url":"https://github.com/eryajf"},"category":null,"labels":{"edges":[{"node":{"name":"更多","color":"25B472"}},{"node":{"name":"Sync-Tools","color":"2f12e5"}},{"node":{"name":"deajan","color":"c05fc4"}}]},"comments":{"edges":[]}}},"pageContext":{"number":423,"previous":{"title":"aliyun/ossutil: 一个用户友好的命令行工具，用于访问阿里云 OSS。","number":422},"next":{"title":"redkubes/otomi-core: 适用于 Kubernetes 的自托管 DevOps 平台","number":424}}},
    "staticQueryHashes": ["151096407","2861350382"]}