自動啟動中繼
oar start 會在背景執行中繼,直到你停止它或機器重新啟動。若要讓中繼自己恢復執行,請安裝自動啟動:oar service install 0.9.9 新增 會在 Linux 和 Windows 上完成設定。0.9.15 新增 oar autostart 可以選擇 Windows 的任一種模式——登入時或開機時——而 oar setup 在 Windows 上會詢問這項設定。之後你就不需要開著終端機,在無介面主機上也不必登入。
服務執行的中繼和 oar start 相同:同樣的設定檔、同樣的資料目錄、同樣的記錄資料夾。你的對話不會有任何改變。0.9.14 新增 在 Windows 上,兩種自動啟動模式也是如此;0.9.14 之前,它們把資料放在已安裝的套件內(見 Windows 項目的資料目錄)。
指令 #
oar service install
oar service status
oar service remove
不加任何參數時,預設為 oar service status。這些指令適用於全域安裝;在 git checkout 中,它們會說明這一點,不做任何事。單獨執行 oar 會開啟一個選單,其中的 Install or remove the service(安裝或移除服務)項目做的是同一件事。oar setup --start 以及 macOS 和 Linux 的安裝程式,會在有 systemd 使用者 session 的環境中替你安裝 Linux 服務。
| 指令 | Linux | Windows |
|---|---|---|
oar service install |
寫入並啟用 systemd 使用者服務、啟用 lingering,並啟動中繼 | 開啟登入時的自動啟動。它不會立即啟動中繼:請執行 oar start |
oar service remove |
停止並停用服務,並刪除它的 unit 檔。中繼會停止 | 關閉登入時的自動啟動。執行中的中繼會繼續執行 |
oar service status |
印出 Service: installed, running、installed, not running 或 not installed |
印出 Autostart: on, at boot (scheduled task)、on, at sign- 或 off |
oar service install 需要設定檔:請先執行 oar setup。
0.9.15 新增 oar autostart 直接指定模式,而不是服務:
oar autostart signin # Windows: at sign-in
oar autostart boot # Windows: at boot, before anyone signs in
oar autostart off
oar autostart status # the default when you give no word
在 Windows 上,它是設定兩種模式的指令,規則和 Settings(設定)中的 Autostart (Windows)(自動啟動,Windows)控制項相同。在 Linux 上它就是 oar service:signin 和 boot 都執行 oar service install,off 執行 oar service remove,status 執行 oar service status。在 macOS 上,它會顯示 Autostart is not supported on mac。在 git checkout 中,它會說明它只適用於全域安裝。signin 和 boot 需要設定檔;off 和 status 不需要。
Linux:systemd 使用者服務 #
0.9.8 新增
服務名稱是 oar。oar service install 會把它的 unit 檔寫到 ~/.,然後啟用並啟動它。它也會為你的使用者執行 loginctl enable-。Lingering 會在沒有人登入時讓你的使用者服務繼續執行,所以中繼在重新開機後會恢復,你登出後也會繼續執行。這些都不需要 sudo。如果無法啟用 lingering,指令會說明,並給出讓你自己執行的那一行,因為沒有 lingering,中繼會在你登出時停止:
loginctl enable-linger "$USER"
這個 unit 會用執行該指令的 Node.js 啟動中繼,並在當機後重新啟動它(Restart=,5 秒後)。0.9.14 新增 它不會重新啟動以結束代碼 78 停止的中繼(Restart):中繼無法使用其資料執行時會用這個代碼,例如另一個中繼持有它的鎖時(見無法正常運作時)。較早版本寫入的 unit 沒有這一行,直到你再次執行 oar service install。unit 帶有執行 oar service install 的那個 shell 的 PATH,再加上 ~/. 和該 Node.js 所在的資料夾,因為 systemd 使用者服務原本會以極簡的 PATH 啟動。中繼的 session 透過它找到供應商 CLI 和 node。你的 PATH 變更後,請再次執行 oar service install,然後執行 oar restart:install 會重寫 unit,但不會重新啟動已在執行的服務。
如果有一個你手動啟動的中繼正在執行,install 會先停止它,讓服務能使用該連接埠。如果那個中繼正在忙、沒有立刻停止,服務仍會安裝,並在下次登入時接手,或在那個中繼停止後你執行 oar start 時接手。
start、stop 和 restart #
安裝服務後,oar start、oar stop 和 oar restart 都會經由 systemd 執行。
| 指令 | 作用 |
|---|---|
oar start |
啟用並啟動服務,並印出中繼網址 |
oar stop |
停止服務。服務仍保持啟用,所以下次你的使用者 session 啟動時它會再次啟動:有 lingering 時是開機時,否則是登入時。oar service remove 會將它永久移除 |
oar restart |
重新啟動服務,並印出中繼網址 |
oar status |
說明中繼是否在執行,並將服務顯示為 installed, running(已安裝,執行中)、installed 或 not installed |
服務會立即停止
沒有服務時,oar stop 和 oar restart 會等待執行中的回合結束。使用 Linux 服務時則不會。systemd 會立即停止或重新啟動服務,執行中的回合會結束,agent 的背景處理程序也會隨服務一起結束,因為 unit 沒有設定任何能讓它們繼續存活的項目。對話及其佇列會保留,下一則訊息會繼續供應商的 session。重新啟動與繼續說明哪些會恢復。若要重新啟動又不中斷回合,請使用對話 ⋯ 選單中的 Restart web relay(重新啟動網頁中繼),它會等待回合結束。
狀態與記錄 #
systemctl --user status oar
會顯示服務是否在執行。unit 不會重新導向中繼的輸出,所以 systemd 會把它保留在 journal 中:用 journalctl --user -u oar 讀取。
unit 也會把中繼的記錄資料夾設為 OAR 狀態資料夾中的 logs 資料夾(預設為 ~/.)。中繼會在那裡以 relay- 保留一份主控台輸出的副本,每個 session worker 則會寫入一個 worker-<session>.。oar doctor 會印出它們所在的狀態資料夾。
server-err.log
當 oar start 失敗時,它會顯示 The relay did not come up — see …/。這個檔案只有在 oar start 自己在背景啟動中繼時才會寫入,服務不會寫入它。安裝服務後,請改看 journal 或 relay-。
Windows #
0.9.2 新增
Windows 有兩種自動啟動模式。兩者都以相同的設定檔執行相同的中繼。
| 登入時 | 開機時 | |
|---|---|---|
| 這是什麼 | 你啟動資料夾中的一個腳本,會在你登入時開啟一個標題為 OAR Web Relay 的可見終端機視窗 | 名為 oar- 的排程任務,在任何人登入之前,以你的身分在無介面的狀態下執行中繼。它在開機 30 秒後啟動;如果中繼失敗,最多會重新啟動 5 次,每次間隔一分鐘 |
| 中繼何時可連線 | 你登入之後 | 開機後約 60 秒,不需要任何人登入 |
| 設定方式 | oar autostart signin、oar service install、oar setup,或 Autostart (Windows) 控制項 |
oar autostart boot、oar setup,或 Autostart (Windows) 控制項 |
| 權限 | 只需你自己的權限 | 開啟和關閉時各需一次系統管理員確認(UAC) |
| 背景中留下什麼 | 終端機視窗 | 任務。沒有視窗,也沒有東西要關 |
控制項位於 ⚙️ Settings → General(設定 → 一般),標示為 Autostart (Windows)。只有在 Windows 上執行的中繼才會顯示它,共有三個選項:
Off
At sign-in — visible terminal after you log on
At system startup — headless, no logon needed
0.9.15 新增 在 Windows 的終端機中,oar setup 會把模式當作最後一個問題詢問,並以目前生效的模式為預設值:
Autostart: 1 = at sign-in, 2 = at boot, before anyone signs in (one administrator prompt), 3 = off [3]:
按 Enter 會維持目前的模式。oar setup --autostart signin|boot|off 可以不經詢問直接設定。如果無法讀取開機任務,setup 就不會詢問。切換沒有成功時,setup 仍會寫入設定檔,並顯示 The config is written; the autostart step did not go through (see above).,然後以結束代碼 1 結束。
每次切換都會移除另一種模式的項目,但只限 OAR 產生的項目(見非 OAR 建立的項目)。
登入時 #
選擇 At sign-in(登入時),或執行 oar autostart signin 或 oar service install。它們都會寫入同一個項目,也就是你啟動資料夾中的 oar-,所以指令和控制項的狀態一致。oar autostart off、oar service remove 或 Off(關閉)會刪除它。它們都不會立即啟動中繼:中繼會在你下次登入時啟動,或者你現在用 oar start 啟動它。從開機模式切換到登入模式時,需要系統管理員確認,以移除開機任務。
開機時 #
選擇 At system startup(開機時),或執行 oar autostart boot。註冊開機任務需要系統管理員權限,而中繼執行時不具備這些權限,所以 Windows 會要求一次系統管理員確認;提升權限的部分只有 schtasks 呼叫。這個提示只會出現在這台電腦本機的桌面上。oar autostart 會印出 Confirm the administrator prompt to register the boot task … 並等待。從其他裝置的瀏覽器操作時,Settings 會顯示 Confirm the admin prompt on the PC…(請在電腦上確認系統管理員提示…)。兩者最多都等待兩分鐘;到時仍無人回應的提示視為失敗。任務以你的使用者身分執行,不儲存密碼。本機檔案和 tunnel 照常運作;任務沒有存取網路共用資料夾的憑證。
切換回 Off 或 At sign-in(oar autostart off、oar autostart signin)需要同樣的確認來移除任務。0.9.15 新增 只有在提示已確認、任務已移除之後,控制項才會開啟登入項目。
0.9.15 新增 拒絕提示不會改變任何東西:Nothing changed: the administrator prompt was declined. 先前的模式維持不變,也不會留下任何檔案。如果提示之後切換本身失敗,它會從副本(OAR 資料夾 %APPDATA%\ 中的 <task>.)還原它刪除的任務,保留副本並回報失敗。如果提示已確認,但之後無法讀回任務,OAR 會說明這一點並指出副本,不復原任何東西。在網頁介面中,失敗時會顯示問題所在,以及一條可改從提升權限的 PowerShell 執行的指令。
0.9.15 新增 即使你的使用者資料夾路徑含有空格、撇號或非 ASCII 字元(例如 C:\),開機模式也能正常開啟和關閉。較早的版本在這種情況下會失敗,或把 OAR 自己的任務當成手動建立的任務。
開機任務會啟動 OAR 產生的啟動器腳本,也就是 OAR 資料夾中的 oar-。0.9.11 新增 啟動器會把 Node.js 的資料夾加到 PATH 的最後。中繼會以完整路徑、用自己的 Node.js 啟動 worker,所以即使任務的 PATH 中沒有 node,worker 也能啟動(agent 處理程序)。
當產生的啟動器不見了,或來自較早的版本時,Settings 會指出差異,而不是回報失敗;再次選擇 At system startup(或執行 oar autostart boot)就會重新產生它。設定變更失敗時,Settings 會顯示中繼回報的原因。如果開機任務旁還有登入項目,設定會警告這可能讓中繼啟動兩次;再次選擇 At system startup 即可清除。
oar service 只會回報這個模式。開機任務存在時,oar service install 和 oar service remove 會拒絕執行,並請你改用 oar autostart signin|off 或 Settings;oar service status 會印出 on, at boot (scheduled task)。
狀態 0.9.15 新增 #
oar autostart status 會印出模式,接著列出每個現有的項目,以及它是否由 OAR 產生:
[oar] Autostart: at boot, before anyone signs in (scheduled task)
[oar] scheduled task \oar-relay (generated by OAR)
[oar] C:\Users\dev\AppData\Roaming\oar\oar-web-relay-launcher.cmd (generated by OAR)
模式會是 at sign-、at boot, before anyone signs in (scheduled task)、off,或 unknown, the boot task could not be read (<reason>)。手動建立的項目會顯示為 <path> (hand-,另一個 OAR 安裝留下的項目則顯示為 <path> (hand-。如果有這類項目,最後一行會說明如何取代它。
非 OAR 建立的項目 0.9.15 新增 #
無論在網頁介面還是 oar autostart 中,OAR 都只會更動與某個 OAR 版本為這個安裝所產生的內容完全相同的自動啟動項目。其他項目一律視為 hand-made,也就是手動建立的項目,絕不會被刪除或覆寫:
- 你編輯過的啟動資料夾項目,或屬於其他 OAR 安裝或設定檔的項目;
- 與 OAR 註冊的開機任務在帳戶、執行層級、唯一的動作、唯一的開機觸發程序或設定上有所不同的開機任務;
- 你編輯過的啟動器;
- 別人建立、名為
oar-的任務,以及品牌更名前的開機任務。relay
當手動建立的項目會留在新模式旁邊,或會被新模式取代時,切換不會做任何變更,並會指出該項目:
[oar] Nothing changed: OAR does not delete or overwrite an autostart entry it did not make. Remove it yourself, or replace it keeping a copy: oar autostart boot --replace.
[oar] Left as it is: C:\Users\dev\AppData\Roaming\oar\oar-web-relay-launcher.cmd (hand-made).
網頁介面會顯示同樣的訊息。屬於你所選模式的手動建立項目會用於該模式並保留下來(Left as it is: …)。若要以 OAR 自己的項目取代手動建立的項目,請在切換時加上 --replace:
oar autostart boot --replace
它會先為每個項目保留一份副本,以 <name>. 存放在 OAR 資料夾(%APPDATA%\):啟動器的副本就在啟動器旁邊;任務的副本是匯出的 XML,存為 <task>.,可以用 schtasks / 匯回;啟動資料夾項目的副本也放在那裡,因為留在啟動資料夾中的副本會在登入時被 Windows 開啟。較早的副本絕不會被覆寫:下一份會是 .。除了 --replace,沒有任何方式會取代手動建立的項目。
OAR 無法讀取的開機任務,例如儲存了另一個帳戶的密碼、回應 Access is denied(拒絕存取)的任務,絕不會被當成不存在。狀態會顯示 unknown, the boot task could not be read (<reason>),而每次切換(包括 --replace)都會以 Nothing changed: the boot task could not be read (<reason>). 停止。
等待 TEMP 和資料磁碟機 0.9.14 新增 #
兩種模式都會在啟動中繼前先等待 %TEMP% 資料夾和資料目錄所在的磁碟機(例如 RAM 磁碟,或由啟動腳本稍後才掛載的磁碟機),總共最多等 5 分鐘。0.9.14 之前,開機模式的啟動器只等 %TEMP% 2 分鐘,登入項目則完全不等。位於網路共用資料夾上的資料目錄不會等待。用引號設定的 TEMP 或 TMP("D:\),或指向不存在資料夾的設定,會為中繼自動修正:去掉引號,或改用你自己的暫存資料夾。
等待時間用完時,會有一行指出仍缺少什麼,然後中繼照樣啟動:
[<date> <time>] Still missing after 300 s: data drive "R:\"; starting the relay anyway.
這一行會寫到開機模式啟動器旁的 oar-;如果是登入項目,則寫到 OAR 資料夾(%APPDATA%\)中的 oar-。如果中繼仍無法建立資料目錄,它會停止,以一行訊息指出該資料夾,並以結束代碼 78 結束,而不是輸出錯誤堆疊。
Windows 項目的資料目錄 0.9.14 新增 #
兩種項目都會以 oar start 使用的設定檔、資料目錄和記錄資料夾啟動中繼:在全域安裝上是 %APPDATA%\、%APPDATA%\ 和 %APPDATA%\。0.9.14 之前,它們只指定設定檔,所以由它們啟動的中繼會把資料庫、上傳的檔案和記錄放在已安裝套件內的 server\、server\ 和 server\:對話和 oar start 的不同,而且下次更新就會消失。從那些版本更新時,請依照升級說明操作。
中繼會在更新後第一次啟動時,自行把 OAR 產生的項目或啟動器(0.9.0 起,也包括品牌更名前的 copilot-)更新到最新,不需要系統管理員確認。你編輯過的項目、指向其他設定檔的項目,以及使用自己資料目錄啟動的中繼的項目,都不會被更動。0.9.15 新增 它們算是手動建立的項目:oar autostart <mode> --replace 會取代它們並保留副本(見非 OAR 建立的項目)。在啟動器所啟動的中繼仍在執行時重寫啟動器是安全的。啟動器會把主控台切換為 UTF-8,所以名稱含有非 ASCII 字元的使用者資料夾,路徑也能保持完整。
macOS #
macOS 上目前還沒有服務可用。oar service 會說明這一點,並指出 oar start。重新開機後,請執行 oar start 再次啟動中繼。安裝程式會在背景啟動它。
WSL #
Linux 服務需要 systemd 使用者 session。WSL 發行版只有在開啟 systemd 時才有。如果沒有開啟,oar service install 會停止並提示你:在 / 的 [boot] 下設定 systemd=,然後從 Windows 用 wsl --terminate <distro> 重新啟動該發行版。在那之前,請使用 oar start。容器或任何沒有 systemd 使用者 session 的 Linux 也一樣。
更新 #
oar update 會要求執行中的中繼自行重新啟動,中繼會在佇列閒置時重新啟動。使用 Linux 服務時也是如此:更新不經過 systemd,所以不會中斷回合。見重新啟動與繼續。服務和自動啟動項目啟動的是已安裝的套件,所以在那次重新啟動後就會執行新版本。更新套件絕不會動到設定檔或資料。0.9.14 新增 唯一的例外是從 Windows 自動啟動的中繼更新到 0.9.14,因為它的資料原本在套件內:見升級說明。
依平台 #
| Linux | Windows | macOS | WSL | |
|---|---|---|---|---|
| 安裝 | oar service install 或 oar autostart |
oar autostart signin|boot、oar setup、Settings(任一模式);oar service install(登入時) |
尚未提供 | 開啟 systemd 時用 oar service install |
| 執行的是什麼 | systemd 使用者服務 oar |
啟動資料夾腳本,或排程任務 oar- |
無 | Linux 服務 |
| 不登入也能執行 | 可以,需啟用 lingering | 只有 At system startup | 否 | 和 Linux 一樣會啟用 lingering |
| 權限 | 你自己的權限 | 登入時模式不需要;開機模式需一次系統管理員確認 | 不適用 | 你自己的權限 |
oar stop 和 oar restart |
有服務時立即執行,不等待回合 | 等待執行中的回合 | 等待執行中的回合 | 有服務時立即執行 |
| 沒有服務時重新開機後 | oar start |
oar start |
oar start |
oar start |
無法正常運作時 #
| 你看到的 | 該怎麼做 |
|---|---|
No systemd user session here, so there is no service to install. |
容器,或沒有 systemd 的 WSL。請開啟 systemd(見 WSL),或執行 oar start |
The service is not supported on mac |
請使用 oar start |
systemctl --user enable --now oar failed |
查看 systemctl --user status oar 和 journalctl --user -u oar |
服務在執行,但 session 說找不到某個工具或 node |
unit 用的是你安裝時的 PATH。請修正你的 PATH,然後再次執行 oar service install |
Could not enable lingering |
執行 loginctl enable-。在那之前,中繼會在你登出時停止 |
Port 3333 is in use by another program |
其他程式,或使用不同 token 的中繼,佔用了該連接埠。請停止它,或用 oar setup --port <port> 選擇其他連接埠,然後執行 oar restart |
| Linux 伺服器重新開機後中繼不見了 | lingering 未啟用。執行 oar service status,然後執行 loginctl enable- |
The relay starts at boot through a scheduled task(Windows) |
oar service 不會變更開機模式。請使用 oar autostart signin 或 oar autostart off,或 ⚙️ Settings → General → Autostart (Windows)(設定 → 一般 → 自動啟動,Windows) |
Nothing changed: OAR does not delete or overwrite an autostart entry it did not make.(Windows) |
有手動建立的項目擋住了;下面幾行會指出它。請自行移除,或加上 --replace 執行同樣的切換。見非 OAR 建立的項目 |
Nothing changed: the administrator prompt was declined.(Windows) |
再次執行指令,並在這台電腦本機的桌面上確認提示 |
Nothing changed: the boot task could not be read (…)(Windows) |
通常是 Access is denied:任務儲存了另一個帳戶的密碼。請以系統管理員身分在工作排程器(Task Scheduler)中查看該任務,並自行刪除或修改它 |
no answer at the administrator prompt within 2 minutes(Windows) |
沒有人及時確認提示。稍後才確認的提示仍可能執行切換:請用 oar autostart status 檢查 |
oar- 或 oar- 中出現 Still missing after 300 s: …(Windows) |
訊息指出的磁碟機或 %TEMP% 資料夾在啟動後 5 分鐘內沒有出現。請檢查掛載它的腳本或程式。見等待 TEMP 和資料磁碟機 |
| 中繼以代碼 78 結束,服務也沒有重新啟動它 | 它無法使用其資料執行:另一個中繼持有鎖、兩個資料庫都有較新的工作,或無法建立資料目錄。結束前的那一行會說明是哪一種情況以及該怎麼做;見疑難排解 |
| 更新後,Windows 自動啟動的中繼原本顯示的對話不見了 | 0.9.14 之前,那個中繼把對話放在套件內。見升級說明 |