Việc cập nhật Cygwin thường gắn liền với giao diện cài đặt cùng với việc phải thường xuyên cập nhật bộ cài từ địa chỉ cygwin.com. Tôi muốn rút ngắn những thao tác này.

Cập nhật Cygwin bằng command line của Windows

Chúng ta không nên nâng cấp Cygwin trong môi trường dòng lệnh của Cygwin bởi vì tất cả các dòng lệnh bao gồm bash đều dựa trên thư viện libcygwin1.dll.

Nếu trong quá trình cài đặt có sự thay đổi thư viện này thì việc cài đặt sẽ xảy ra lỗi do môi trường Windows ngăn cản chỉnh sửa file đang được sử dụng.

Vì vậy tốt nhất nên nâng cấp Cygwin trên môi trường cmd của Windows.

Ngoài ra có lẽ bạn cũng đã cài đặt một vài service của Cygwin, điển hình là SSH server. Khi các dịch vụ này đang chạy thì chúng ta cũng không thể cập nhật được chúng. Việc cập nhật thư viện libcygwin1.dll nếu cần cũng không thể thực hiện được.

Để xác định bạn đang có dịch vụ của Cygwin nào đang hoạt động phải dùng cygrunsrv.

Liệt kê các dịch vụ của Cygwin:

C:\cygwin64\bin\cygrunsrv -L

Tắt một dịch vụ của Cygwin, ví dụ SSH.

C:\cygwin64\bin\cygrunsrv --stop cygsshd

Tải bộ cài Cygwin từ dòng lệnh

Nếu đã cài đặt Cygwin và lệnh wget, ta có thể lợi dụng để tải Cygwin về như sau:

C:\cygwin64\bin\wget https://cygwin.com/setup-x86_64.exe

Tuy nhiên nếu chưa cài đặt Cygwin hoặc chưa cài wget thì rất tiếc, môi trường cmd của Windows không có lệnh nào giúp tải file tiện lợi như vậy.

Để làm được điều đó, chúng ta sử dụng ngôn ngữ VBScript (Visual Basic Script Edition). Lưu ý phần mở rộng của file phải là .vbs.

download.vbs

Option Explicit
Dim args, http, fileSystem, adoStream, url, target, status

Set args = Wscript.Arguments
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
url = args(0)
target = args(1)
WScript.Echo "Getting '" & target & "' from '" & url & "'..."

http.Open "GET", url, False
http.Send
status = http.Status

If status <> 200 Then
    WScript.Echo "FAILED to download: HTTP Status " & status
    WScript.Quit 1
End If

Set adoStream = CreateObject("ADODB.Stream")
adoStream.Open
adoStream.Type = 1
adoStream.Write http.ResponseBody
adoStream.Position = 0

Set fileSystem = CreateObject("Scripting.FileSystemObject")
If fileSystem.FileExists(target) Then fileSystem.DeleteFile target
adoStream.SaveToFile target
adoStream.Close

Từ đó ta có thể tải bộ cài đặt Cygwin như sau. File VBScript được biên dịch bằng lệnh cscript của Windows.

cscript download.vbs https://cygwin.com/setup-x86_64.exe setup-x86_64.exe

Cập nhật Cygwin không cần tương tác (non-interactive)

Bộ cài đặt Cygwin có rất nhiều tham số. Hãy xem danh sách tham số bằng lệnh:

setup-x86_64.exe --help

Để phục vụ cho mục đích cài đặt nhanh, ta quan tâm đến hai tham số sau:

-q --quiet-mode     Chế độ cài đặt không cần tương tác
-g --upgrade-also   Nâng cập các gói đã cài đặt

Hãy thử cài đặt & nâng cấp bằng cách chạy lệnh sau

setup-x86_64.exe -q -g

File batch tự động cập nhật Cygwin

Kết hợp những điều nêu trên, ta tạo mộtfile BAT để cài đặt Cygwin như sau. Để thực hiện cập nhật tự động, hãy gọi script này với Task Manager.

cygwin-update.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET DLOAD_SCRIPT=download.vbs
SET CYGRUNSRV=c:\cygwin64\bin\cygrunsrv

:: Download Cygwin installer
cscript //Nologo %DLOAD_SCRIPT% http://cygwin.com/setup-x86_64.exe setup-x86_64.exe

:: Turn off all running services
FOR /F "tokens=* USEBACKQ" %%F IN (`%CYGRUNSRV% -L`) DO (
    %CYGRUNSRV% --stop %%F
)

:: Update Cygwin packages
setup-x86_64.exe --quiet-mode --upgrade-also

:: Resume the background services
FOR /F "tokens=* USEBACKQ" %%F IN (`%CYGRUNSRV% -L`) DO (
    %CYGRUNSRV% --start %%F
)