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 //Nologo 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 )