Chạy một tiến trình ở chế độ nền trong Linux. Làm cách nào để chạy các lệnh Linux trong nền? Quá trình chạy Linux ở chế độ nền

Bắt đầu và xử lý các tiến trình nền: quản lý công việc

Bạn có thể nhận thấy rằng sau khi bạn nhập lệnh vào Phần cuối "e, bạn thường phải đợi nó hoàn thành trước khi vỏ bọc sẽ trả lại cho bạn quyền kiểm soát. Điều này có nghĩa là bạn đã chạy lệnh trongchế độ ưu tiên . Tuy nhiên, có những lúc điều này là không mong muốn.

Ví dụ, giả sử bạn quyết định sao chép đệ quy một thư mục lớn này sang một thư mục lớn khác. Bạn cũng chọn bỏ qua lỗi nên bạn đã chuyển hướng kênh lỗi tới/dev/null :

cp -R hình ảnh/ /shared/ 2>/dev/null

Lệnh này có thể mất vài phút để hoàn thành. Bạn có hai giải pháp: thứ nhất là tàn nhẫn, ngụ ý dừng (giết) lệnh, sau đó thực hiện lại lệnh đó, nhưng vào thời điểm thích hợp hơn. Để thực hiện việc này, hãy nhấp vào Ctrl+c : Thao tác này sẽ kết thúc quá trình và đưa bạn trở lại lời nhắc. Nhưng chờ đã, đừng làm điều đó vội! Đọc tiếp.

Giả sử bạn muốn một lệnh được thực thi trong khi bạn làm việc khác. Giải pháp sẽ là chạy quy trình tronglý lịch . Để thực hiện việc này, hãy nhấp vào Ctrl+z để tạm dừng quá trình:

Trong trường hợp này, quy trình sẽ tiếp tục công việc của nó nhưng ở dạng tác vụ nền, như được biểu thị bằng dấu hiệu & (ký hiệu) ở cuối dòng. Sau đó, bạn sẽ được đưa trở lại lời nhắc và có thể tiếp tục làm việc. Một tiến trình chạy dưới dạng tác vụ nền hoặc ở chế độ nền được gọi là nềnnhiệm vụ .

Tất nhiên, bạn có thể chạy ngay các tiến trình dưới dạng tác vụ nền bằng cách thêm dấu & ở cuối lệnh. Ví dụ: bạn có thể chạy lệnh sao chép thư mục trong nền bằng cách gõ:

cp -R hình ảnh/ /shared/ 2>/dev/null &

Nếu muốn, bạn cũng có thể khôi phục quá trình này về nền trước và đợi nó hoàn tất bằng cách gõfg (Vấn đề xung quanh - sự ưu tiên). Để đưa nó trở lại nền, hãy nhập trình tự sau Ctrl+z , bg .

Bằng cách này, bạn có thể chạy một số tác vụ: mỗi lệnh sẽ được gán một số tác vụ. Đội vỏ "a việc làm hiển thị danh sách tất cả các công việc liên quan đến công việc hiện tại vỏ bọc "om. Trước nhiệm vụ có một dấu hiệu + , đánh dấu quá trình cuối cùng đang chạy trong nền. Để khôi phục một công việc cụ thể về chế độ ưu tiên, bạn có thể nhập lệnhfg , Ở đâu - số nhiệm vụ, ví dụ,fg 5 .

Nhiệm vụ và quy trình

Bất kỳ chương trình nào chạy trên Linux đều được gọi là quá trình. Linux là một hệ thống đa nhiệm được đặc trưng bởi thực tế là nhiều quy trình thuộc về một hoặc nhiều người dùng có thể được thực thi đồng thời. Bạn có thể hiển thị danh sách các tiến trình hiện đang chạy bằng lệnh ps, ví dụ như sau:

/home/larry# ps PID TT STAT TIME COMMAND 24 3 S 0:03 (bash) 161 3 R 0:00 ps /home/larry#

Xin lưu ý rằng theo mặc định lệnh ps chỉ hiển thị danh sách các quy trình thuộc về người dùng đã khởi chạy nó. Để xem tất cả các tiến trình đang chạy trong hệ thống, bạn cần ra lệnh ps -a . Số quy trình(ID tiến trình hoặc PID), được liệt kê trong cột đầu tiên, là các số duy nhất mà hệ thống gán cho mỗi tiến trình đang chạy. Cột cuối cùng, có tiêu đề LỰA CHỌN, cho biết tên của lệnh đang được chạy. Trong trường hợp này, danh sách chứa các tiến trình do chính người dùng Larry khởi chạy. Có nhiều tiến trình khác đang chạy trong hệ thống; danh sách đầy đủ của chúng có thể được xem bằng lệnh ps-aux. Tuy nhiên, trong số các lệnh do người dùng larry chạy, chỉ có bash (shell lệnh cho người dùng larry) và chính lệnh đó ps. Có thể thấy bash shell chạy đồng thời với lệnh ps. Khi người dùng nhập lệnh ps, bash shell bắt đầu thực thi nó. Sau đội psđã hoàn thành công việc của nó (bảng quy trình được hiển thị), điều khiển quay trở lại quy trình bash. Sau đó, bash shell hiển thị lời nhắc và chờ lệnh mới.

Một tiến trình đang chạy còn được gọi là nhiệm vụ(công việc). Các thuật ngữ quy trình và nhiệm vụ được sử dụng thay thế cho nhau. Tuy nhiên, thông thường một tiến trình được gọi là một nhiệm vụ khi nó có nghĩa là quản lý công việc(kiểm soát công việc). Kiểm soát công việc là một tính năng shell lệnh cung cấp cho người dùng khả năng chuyển đổi giữa nhiều công việc.

Trong hầu hết các trường hợp, người dùng sẽ chỉ chạy một tác vụ - đây sẽ là lệnh cuối cùng họ nhập vào shell lệnh. Tuy nhiên, nhiều shell (bao gồm bash và tcsh) có chức năng quản lý công việc(kiểm soát công việc), cho phép bạn chạy nhiều lệnh cùng lúc hoặc nhiệm vụ(công việc) và, nếu cần, chuyển đổi giữa chúng.

Quản lý công việc có thể hữu ích, chẳng hạn như nếu bạn đang chỉnh sửa một tệp văn bản lớn và muốn tạm thời gián đoạn việc chỉnh sửa để thực hiện một số thao tác khác. Bạn có thể sử dụng các tính năng quản lý công việc để tạm thời rời khỏi trình soạn thảo, quay lại dấu nhắc shell và thực hiện các hành động khác. Khi hoàn tất, bạn có thể quay lại làm việc với trình chỉnh sửa và tìm thấy nó ở trạng thái tương tự như khi còn lại. Có nhiều cách sử dụng hữu ích hơn cho các chức năng quản lý công việc.

Chế độ nền trước và nền sau

Nhiệm vụ có thể là vấn đề xung quanh(tiền cảnh), hoặc lý lịch(lý lịch). Chỉ có thể có một nhiệm vụ ở nền trước tại bất kỳ thời điểm nào. Tác vụ nền trước là tác vụ mà bạn đang tương tác; nó nhận đầu vào từ bàn phím và gửi đầu ra ra màn hình (tất nhiên trừ khi bạn chuyển hướng đầu vào hoặc đầu ra sang nơi khác). Ngược lại, các công việc nền không nhận được đầu vào của thiết bị đầu cuối; Thông thường, những công việc như vậy không yêu cầu sự tương tác của người dùng.

Một số nhiệm vụ mất rất nhiều thời gian để hoàn thành và không có gì thú vị xảy ra khi chúng đang chạy. Một ví dụ về các tác vụ như vậy là biên dịch chương trình cũng như nén các tệp lớn. Không có lý do gì để nhìn chằm chằm vào màn hình và chờ đợi những tác vụ này hoàn thành. Những công việc như vậy nên được chạy ở chế độ nền. Trong thời gian này, bạn có thể làm việc với các chương trình khác.

Để kiểm soát việc thực thi các tiến trình trong Linux, một cơ chế chuyển giao được cung cấp tín hiệu. Tín hiệu là khả năng các quá trình trao đổi các tin nhắn ngắn tiêu chuẩn trực tiếp bằng hệ thống. Tin nhắn tín hiệu không chứa bất kỳ thông tin nào ngoại trừ số tín hiệu (để thuận tiện, có thể sử dụng tên do hệ thống xác định trước thay vì số). Để truyền tín hiệu, một tiến trình chỉ cần sử dụng lệnh gọi hệ thống giết() và để nhận được tín hiệu, bạn không cần bất cứ thứ gì. Nếu một tiến trình cần phản hồi tín hiệu theo một cách đặc biệt nào đó, nó có thể đăng ký người xử lý và nếu không có trình xử lý, hệ thống sẽ phản hồi. Thông thường, điều này khiến quá trình nhận tín hiệu chấm dứt ngay lập tức. Bộ xử lý tín hiệu bắt đầu không đồng bộ, ngay khi nhận được tín hiệu, bất kể quá trình đang thực hiện gì vào thời điểm đó.

Hai tín hiệu - số 9 ( GIẾT) và 19 ( DỪNG LẠI) - luôn được hệ thống xử lý. Việc đầu tiên trong số chúng là cần thiết để chắc chắn giết chết quá trình (do đó có tên). Tín hiệu DỪNG LẠI đình chỉ tiến trình: ở trạng thái này, tiến trình không bị xóa khỏi bảng tiến trình, nhưng không được thực thi cho đến khi nhận được tín hiệu 18 ( TIẾP TỤC) - sau đó nó sẽ tiếp tục hoạt động. Trong shell lệnh Linux, tín hiệu DỪNG LẠI có thể được chuyển đến tiến trình đang hoạt động bằng cách sử dụng chuỗi thoát Điều khiển -Z .

Tín hiệu số 15 ( THUẬT NGỮ) làm gián đoạn công việc. Tại gián đoạn(ngắt) quá trình công việc chết. Công việc thường bị gián đoạn bởi một chuỗi thoát Điều khiển -C. Không có cách nào để khôi phục một công việc bị gián đoạn. Bạn cũng nên biết rằng một số chương trình chặn tín hiệu THUẬT NGỮ(sử dụng bộ xử lý), sao cho việc nhấn tổ hợp phím Điều khiển -C(o) không được chấm dứt quá trình ngay lập tức. Điều này được thực hiện để chương trình có thể xóa dấu vết công việc của nó trước khi hoàn thành. Trong thực tế, một số chương trình không thể bị gián đoạn theo cách này.

Chuyển sang nền và hủy công việc

Hãy bắt đầu với một ví dụ đơn giản. Chúng ta hãy xem lệnh có, lệnh này thoạt nhìn có vẻ vô dụng. Lệnh này gửi một chuỗi chuỗi vô tận bao gồm ký tự y đến đầu ra tiêu chuẩn. Hãy xem lệnh này hoạt động như thế nào:

/home/larry# vâng y y y y y

Trình tự của những dòng như vậy sẽ tiếp tục vô tận. Bạn có thể hủy quá trình này bằng cách gửi cho nó một tín hiệu ngắt, tức là bằng cách nhấn Điều khiển -C. Bây giờ chúng ta hãy làm mọi việc khác đi. Để ngăn chuỗi vô tận này hiển thị trên màn hình, chúng tôi sẽ chuyển hướng đầu ra tiêu chuẩn của lệnh có sang /dev/null . Như bạn có thể biết, thiết bị /dev/null hoạt động như một "lỗ đen": tất cả dữ liệu được gửi tới thiết bị này đều bị mất. Sử dụng thiết bị này sẽ rất thuận tiện để loại bỏ quá nhiều đầu ra từ một số chương trình.

/home/larry# có > /dev/null

Bây giờ không có gì được hiển thị trên màn hình. Tuy nhiên, dấu nhắc shell cũng không được trả về. Điều này là do lệnh có vẫn đang chạy và gửi các tin nhắn bao gồm các chữ cái y tới /dev/null . Bạn cũng có thể hủy tác vụ này bằng cách gửi cho nó một tín hiệu ngắt.

Bây giờ, giả sử bạn muốn lệnh có tiếp tục hoạt động nhưng cũng trả lại dấu nhắc shell về màn hình để bạn có thể làm việc với các chương trình khác. Để thực hiện việc này, bạn có thể đặt lệnh vâng ở chế độ nền và nó sẽ hoạt động ở đó mà không cần liên lạc với bạn.

Một cách để đưa một tiến trình vào nền là thêm & vào cuối lệnh. Ví dụ:

/home/larry# có > /dev/null & + 164 /home/larry#

Tin nhắn là số công việc(mã số công việc) cho quy trình có. Shell lệnh gán một số công việc cho mỗi công việc mà nó chạy. Vì có là công việc thực thi duy nhất nên nó được gán số 1. Số 164 là số nhận dạng liên quan đến quy trình này (PID) và số này cũng được hệ thống cấp cho quy trình. Như chúng ta sẽ thấy sau, một quy trình có thể được truy cập bằng cách chỉ định cả hai số này.

Vì vậy, bây giờ chúng ta có một quy trình có đang chạy ở chế độ nền, liên tục gửi một luồng y đến thiết bị /dev/null. Để tìm hiểu trạng thái của quá trình này, bạn cần thực hiện lệnh việc làm, đây là lệnh nội bộ của shell.

/home/larry# jobs + Đang chạy có >/dev/null & /home/larry#

Chúng tôi thấy rằng chương trình này thực sự hiệu quả. Để tìm hiểu trạng thái của một tác vụ, bạn cũng có thể sử dụng lệnh ps, như được trình bày ở trên.

Để truyền tín hiệu đến quy trình (thường cần có ngắt công việc) tiện ích được sử dụng giết. Lệnh này được cung cấp một mã số công việc hoặc một PID làm đối số. Tham số tùy chọn là số lượng tín hiệu cần được gửi đến tiến trình. Theo mặc định, tín hiệu được gửi THUẬT NGỮ. Trong trường hợp trên, mã số công việc là 1, vì vậy lệnh giết %1 sẽ làm gián đoạn công việc. Khi một công việc được truy cập bằng số của nó (chứ không phải bằng PID), thì số đó phải được đặt trước ký hiệu phần trăm (“%”) trên dòng lệnh.

Bây giờ hãy nhập lệnh việc làm một lần nữa để kiểm tra kết quả của hành động trước đó:

/home/larry# jobs Đã chấm dứt có >/dev/null

Trên thực tế, công việc đã bị hủy và lần sau khi bạn nhập lệnh công việc, sẽ không có thông tin nào về nó trên màn hình.

Bạn cũng có thể hủy một công việc bằng cách sử dụng số nhận dạng quy trình (PID). Con số này cùng với mã số nhận dạng công việc được chỉ định khi công việc bắt đầu. Trong ví dụ của chúng tôi, giá trị PID là 164, vì vậy lệnh giết 164 sẽ tương đương với lệnh giết %1. Khi sử dụng PID làm đối số cho lệnh kill, bạn không cần nhập ký tự "%".

Tạm dừng và tiếp tục công việc

Trước tiên chúng ta hãy bắt đầu quá trình với lệnh có ở nền trước, như đã được thực hiện trước đó:

/home/larry# có > /dev/null

Như trước đây, vì tiến trình đang chạy ở nền trước nên dấu nhắc shell không quay lại màn hình.

Bây giờ, thay vì làm gián đoạn nhiệm vụ bằng tổ hợp phím Điều khiển -C, nhiệm vụ có thể đình chỉ(đình chỉ, nghĩa đen - đình chỉ), gửi cho anh ta một tín hiệu DỪNG LẠI. Để tạm dừng một tác vụ, bạn cần nhấn tổ hợp phím thích hợp, thường là tổ hợp phím này Điều khiển -Z .

/home/larry# có > /dev/null Điều khiển -Z+ Đã dừng có >/dev/null /home/larry#

Quá trình bị đình chỉ đơn giản là không thực thi. Nó không tiêu tốn tài nguyên bộ xử lý. Một tác vụ bị tạm dừng có thể được bắt đầu chạy từ cùng một điểm như thể nó chưa bị tạm dừng.

Để tiếp tục công việc đang chạy ở nền trước, bạn có thể sử dụng lệnh fg(từ chữ foreground - tiền cảnh).

/home/larry# fg có >/dev/null

Shell lệnh sẽ một lần nữa hiển thị tên lệnh để người dùng biết mình hiện đang chạy tác vụ nào ở nền trước. Hãy tạm dừng tác vụ này một lần nữa bằng cách nhấn các phím Điều khiển -Z, nhưng lần này hãy khởi chạy nó ở chế độ nền bằng lệnh bg(từ chữ nền - nền). Điều này sẽ khiến tiến trình chạy như thể nó đã được chạy bằng lệnh có & ở cuối (như đã được thực hiện trong phần trước):

/home/larry# bg + vâng $>$/dev/null & /home/larry#

Dấu nhắc shell được trả về. Bây giờ đội việc làm phải chứng tỏ rằng quá trình Đúngđang thực sự hoạt động vào lúc này; quá trình này có thể bị giết bằng lệnh giết, như đã được thực hiện trước đó.

Bạn không thể sử dụng phím tắt để tạm dừng tác vụ đang chạy ẩn Điều khiển -Z. Trước khi tạm dừng một công việc, nó phải được đưa lên nền trước bằng lệnh fg và chỉ sau đó dừng lại. Như vậy, lệnh fg có thể được áp dụng cho các công việc bị treo hoặc cho một công việc đang chạy ở chế độ nền.

Có sự khác biệt lớn giữa công việc nền và công việc bị tạm dừng. Công việc bị tạm dừng không chạy - nó không tiêu tốn năng lượng của bộ xử lý. Công việc này không thực hiện bất kỳ hành động nào. Một tác vụ bị treo chiếm một lượng RAM máy tính nhất định; sau một thời gian, kernel sẽ bơm phần bộ nhớ này vào ổ cứng" nhà hàng sau" Ngược lại, tác vụ nền sẽ chạy, sử dụng bộ nhớ và thực hiện một số việc mà bạn có thể muốn thực hiện nhưng có thể bạn đang làm việc trên các chương trình khác cùng lúc.

Các công việc đang chạy ẩn có thể cố gắng hiển thị một số văn bản trên màn hình. Điều này sẽ cản trở việc thực hiện các nhiệm vụ khác.

/nhà/larry# vâng &

Ở đây, đầu ra tiêu chuẩn chưa được chuyển hướng đến thiết bị /dev/null, do đó, một dòng ký tự y vô tận sẽ được in ra màn hình. Chủ đề này không thể dừng lại vì tổ hợp phím Điều khiển -C không ảnh hưởng đến công việc ở chế độ nền. Để dừng đầu ra này, bạn cần sử dụng lệnh fg, thao tác này sẽ đưa tác vụ lên nền trước và sau đó hủy tác vụ bằng tổ hợp phím Điều khiển -C .

Hãy đưa ra một nhận xét nữa. Thông thường theo đội fg và đội bgảnh hưởng đến những công việc đã bị đình chỉ gần đây nhất (những công việc này sẽ được đánh dấu bằng ký hiệu + bên cạnh mã số công việc nếu bạn nhập lệnh việc làm). Nếu một hoặc nhiều công việc đang chạy cùng lúc, công việc có thể được đặt ở nền trước hoặc nền sau bằng cách chỉ định các lệnh làm đối số fg hoặc lệnh bg số nhận dạng của họ (ID công việc). Ví dụ, lệnh fg %2đặt công việc số 2 lên phía trước và lệnh bg %3đặt công việc số 3 ở chế độ nền. Sử dụng PID làm đối số lệnh fgbg nó bị cấm.

Hơn nữa, để đưa một công việc lên nền trước, bạn chỉ cần chỉ định số của nó. Vâng, đội %2 sẽ tương đương với lệnh fg %2 .

Điều quan trọng cần nhớ là chức năng kiểm soát công việc thuộc về shell. Đội fg , bgviệc làm là các lệnh nội bộ shell. Nếu vì lý do nào đó, bạn đang sử dụng shell lệnh không hỗ trợ các chức năng quản lý công việc, thì bạn sẽ không tìm thấy các lệnh này (và tương tự) trong đó.

Việc quản trị một máy chủ chạy Linux thường đi kèm với nhiều thao tác lệnh trong cửa sổ terminal. Đây là hình ảnh quen thuộc với những người quản trị máy chủ Linux và trong một số trường hợp, việc chạy các lệnh ở chế độ nền sẽ rất thuận tiện. Điều này có thể được sử dụng tốt trong thực tế và cần lưu ý lý do tại sao nó có thể hữu ích:
— Khi thiết bị đầu cuối bị quá tải với một loạt tin nhắn và không thể thực hiện song song các hành động bổ sung;
— Nếu bạn đóng thiết bị đầu cuối, quy trình hiện tại và các quy trình con của nó sẽ dừng lại;
Những vấn đề này có thể được giải quyết một cách đơn giản; nói một cách đơn giản, chúng ta cần tách biệt hoàn toàn quy trình đang chạy khỏi thiết bị đầu cuối điều khiển.

Trong bài đăng này, chúng ta sẽ xem xét khả năng hữu ích của Linux trong việc chạy các lệnh trong nền. Nói cách khác, quá trình bạn khởi chạy sẽ được thực thi riêng biệt với thiết bị đầu cuối điều khiển.

Cách chạy lệnh hoặc tiến trình trong nền
Nếu quá trình của bạn đang chạy trong cửa sổ terminal, bạn có thể tạm dừng nó bằng lệnh Ctrl+Z, chắc nhiều người biết điều này và sẽ nghĩ, vậy thì sao. Và đây là điều thú vị, do đó, sau khi tạm dừng quá trình, chúng ta có thể tiếp tục nó ở chế độ nền, để làm được điều này, chúng ta cần nhập lệnh

Sau khi nhập lệnh này, quá trình sẽ tiếp tục nhưng ở chế độ nền. Để xem tất cả các tiến trình đang chạy ẩn, bạn có thể nhập lệnh

Hãy xem một ví dụ đơn giản về cách áp dụng điều này. Giả sử chúng ta có một tệp , chúng ta cần giải nén nhưng chúng ta không có thời gian chờ đợi và chúng ta muốn làm việc song song.

Giải nén kho lưu trữ ở chế độ nền

$ tar -czf home.tar.gz .

Nhấp chuột Ctrl+Z, sau đó nhập lệnh

$bg$việc làm

Cách thứ hai là thêm & vào cuối lệnh, thao tác này sẽ báo cho hệ thống chạy lệnh ở chế độ nền.

$ tar -czf home.tar.gz . &$việc làm

Phương pháp này cho phép các tiến trình chạy ở chế độ nền, tuy nhiên, STDIN, TUYỆT VỜI, STDERR vẫn được kết nối với thiết bị đầu cuối. Bây giờ hãy đảm bảo rằng quy trình vẫn chạy ngay cả khi thiết bị đầu cuối bị đóng.

Thực hiện một tiến trình sau khi đóng cửa sổ terminal
Để giữ cho quá trình chạy ngay cả sau khi đóng cửa sổ terminal, chúng ta có thể sử dụng lệnh từ chối. Nó sẽ “tháo móc” tiến trình ra khỏi shell của cửa sổ terminal, sau đó nó sẽ được thực thi ngay cả sau khi cửa sổ giao diện điều khiển được đóng lại.
Hãy xem một ví dụ về cách sử dụng lệnh tiêu chuẩn rsync, hãy thử thực thi nó ở chế độ nền và hủy liên kết quá trình khỏi thiết bị đầu cuối.

$ sudo rsync Mẫu/* /var/www/html/ & $ jobs $ disown -h %1 $ jobs

Bạn cũng có thể sử dụng lệnh không có gì, nó sẽ cho phép tiến trình tiếp tục chạy ngay cả khi người dùng thoát khỏi shell hệ thống.

$ nohup tar -czf iso.tar.gz Mẫu/* & $ công việc

Cách tách một tiến trình khỏi thiết bị đầu cuối điều khiển Linux
Để tách hoàn toàn quy trình khỏi thiết bị đầu cuối điều khiển, bạn cũng có thể sử dụng lệnh sẽ có hiệu quả khi sử dụng giao diện người dùng đồ họa (GUI), chẳng hạn như trình duyệt Firefox.

$firefox/dev/null &

Trên Linux (và hầu như tất cả các hệ thống Unix), /dev/null là một tệp thiết bị đặc biệt, còn được gọi là “thiết bị null”. Việc ghi vào nó được thực hiện thành công, bất kể lượng thông tin được ghi là bao nhiêu, việc đọc từ nó tương đương với việc đọc phần cuối của tệp (EOF).

Lần trước chúng ta đã nói về cách làm việc với các luồng đầu vào, đầu ra và lỗi trong tập lệnh bash, bộ mô tả tệp và chuyển hướng luồng. Bây giờ bạn đã biết đủ để viết một cái gì đó của riêng bạn. Ở giai đoạn thành thạo bash này, bạn có thể có câu hỏi về cách quản lý các tập lệnh đang chạy và cách tự động khởi chạy chúng.

Cho đến nay, chúng ta đã nhập tên tập lệnh vào dòng lệnh và nhấn Enter, điều này khiến các chương trình chạy ngay lập tức, nhưng đó không phải là cách duy nhất để gọi tập lệnh. Hôm nay chúng ta sẽ nói về cách một tập lệnh có thể hoạt động với các tín hiệu Linux, về các cách tiếp cận khác nhau để chạy tập lệnh và quản lý chúng trong khi chạy.

Tín hiệu Linux

Trong Linux, có hơn ba chục tín hiệu được tạo ra bởi hệ thống hoặc ứng dụng. Dưới đây là danh sách những cái được sử dụng phổ biến nhất chắc chắn sẽ có ích khi phát triển các tập lệnh dòng lệnh.
Mã tín hiệu
Tên
Sự miêu tả
1
ĐĂNG KÍ
Đóng thiết bị đầu cuối
2
ĐĂNG NHẬP
Tín hiệu dừng quá trình của người dùng từ terminal (CTRL + C)
3
SIGQUIT
Tín hiệu dừng quá trình của người dùng từ thiết bị đầu cuối (CTRL + \) bằng kết xuất bộ nhớ
9
SIGKILL
Chấm dứt vô điều kiện của quá trình
15
SIGTERM
Tín hiệu yêu cầu kết thúc quá trình
17
SIGSTOP
Buộc một quá trình bị đình chỉ nhưng không chấm dứt
18
SIGTSTP
Tạm dừng quá trình từ thiết bị đầu cuối (CTRL+Z) nhưng không tắt
19
SIGCONT
Tiếp tục thực hiện một tiến trình đã dừng trước đó

Nếu bash shell nhận được tín hiệu SIGHUP khi bạn đóng thiết bị đầu cuối, nó sẽ thoát. Trước khi thoát, nó sẽ gửi tín hiệu SIGHUP tới tất cả các tiến trình đang chạy trong đó, bao gồm cả các tập lệnh đang chạy.

Tín hiệu SIGINT khiến hoạt động tạm thời dừng lại. Nhân Linux ngừng phân bổ thời gian xử lý cho shell. Khi điều này xảy ra, shell sẽ thông báo cho các tiến trình bằng cách gửi cho chúng tín hiệu SIGINT.

Các tập lệnh Bash không kiểm soát các tín hiệu này, nhưng chúng có thể nhận ra chúng và thực thi một số lệnh nhất định để chuẩn bị tập lệnh cho những hậu quả do tín hiệu gây ra.

Gửi tín hiệu đến tập lệnh

Shell bash cho phép bạn gửi tín hiệu đến tập lệnh bằng phím tắt. Điều này rất hữu ích nếu bạn cần tạm dừng một tập lệnh đang chạy hoặc chấm dứt hoạt động của nó.

Chấm dứt một quá trình

Tổ hợp phím CTRL + C tạo ra tín hiệu SIGINT và gửi nó đến tất cả các tiến trình đang chạy trong shell, khiến chúng chấm dứt.

Hãy chạy lệnh sau trong shell:

$ ngủ 100
Sau đó, chúng ta sẽ hoàn thành công việc của nó bằng tổ hợp phím CTRL + C.


Chấm dứt một tiến trình từ bàn phím

Tạm dừng quá trình

Tổ hợp phím CTRL + Z tạo ra tín hiệu SIGTSTP, tín hiệu này sẽ tạm dừng quá trình nhưng không chấm dứt nó. Quá trình này vẫn còn trong bộ nhớ và công việc của nó có thể được tiếp tục. Hãy chạy lệnh trong shell:

$ ngủ 100
Và tạm dừng nó bằng tổ hợp phím CTRL + Z.


Tạm dừng quá trình

Số trong ngoặc vuông là số công việc mà shell gán cho tiến trình. Shell xử lý các tiến trình đang chạy bên trong nó như các công việc có số duy nhất. Quá trình đầu tiên được gán số 1, quá trình thứ hai - 2, v.v.

Nếu bạn tạm dừng một công việc được liên kết với shell và cố gắng thoát khỏi nó, bash sẽ đưa ra cảnh báo.

Bạn có thể xem các công việc bị tạm dừng bằng lệnh sau:

Ps –l


Danh sach cong viec

Trong cột S hiển thị trạng thái quy trình, T được hiển thị cho các quy trình bị treo. Điều này cho biết lệnh bị treo hoặc ở trạng thái theo dõi.

Nếu bạn cần chấm dứt một quá trình bị đình chỉ, bạn có thể sử dụng lệnh kill. Bạn có thể đọc chi tiết về nó.

Cuộc gọi của cô ấy trông như thế này:

Giết tiến trìnhID

Chặn tín hiệu

Để bật tính năng theo dõi tín hiệu Linux trong tập lệnh, hãy sử dụng lệnh bẫy. Nếu tập lệnh nhận được tín hiệu được chỉ định khi gọi lệnh này, nó sẽ xử lý tín hiệu đó một cách độc lập, trong khi shell sẽ không xử lý tín hiệu đó.

Lệnh bẫy cho phép tập lệnh phản hồi các tín hiệu mà shell sẽ xử lý mà không cần sự can thiệp của nó.

Chúng ta hãy xem một ví dụ cho thấy lệnh bẫy chỉ định mã sẽ được thực thi như thế nào và danh sách các tín hiệu, cách nhau bằng dấu cách, mà chúng ta muốn chặn. Trong trường hợp này nó chỉ là một tín hiệu:

#!/bin/bash bẫy "echo " Trapped Ctrl-C"" SIGINT echo Đây là tập lệnh kiểm tra count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($ đếm + 1)) xong
Lệnh bẫy được sử dụng trong ví dụ này sẽ in một tin nhắn văn bản bất cứ khi nào nó gặp tín hiệu SIGINT, tín hiệu này có thể được tạo bằng cách nhấn Ctrl + C trên bàn phím.


Chặn tín hiệu

Mỗi lần bạn nhấn CTRL + C , tập lệnh sẽ thực thi lệnh echo được chỉ định khi gọi trace thay vì để shell kết thúc nó.

Bạn có thể chặn tín hiệu thoát tập lệnh bằng cách sử dụng tên của tín hiệu EXIT khi gọi lệnh bẫy:

#!/bin/bash bẫy "echo Goodbye..." EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) xong


Chặn tín hiệu thoát tập lệnh

Khi tập lệnh thoát, bình thường hoặc do tín hiệu SIGINT, shell sẽ chặn và thực thi lệnh echo.

Sửa đổi tín hiệu bị chặn và hủy bỏ việc chặn

Để sửa đổi các tín hiệu bị tập lệnh chặn, bạn có thể chạy lệnh bẫy với các tham số mới:

#!/bin/bash bẫy "echo "Ctrl-C bị mắc kẹt."" SIGINT count=1 trong khi [ $count -le 5 ] làm echo "Loop #$count" sleep 1 count=$(($count + 1) ) done bẫy "echo "Tôi đã sửa đổi bẫy!"" SIGINT count=1 while [ $count -le 5 ] do echo "Second Loop #$count" sleep 1 count=$(($count + 1)) done


Sửa đổi chặn tín hiệu

Sau khi sửa đổi, tín hiệu sẽ được xử lý theo cách mới.

Việc chặn tín hiệu cũng có thể bị hủy bằng cách thực hiện lệnh bẫy, chuyển cho nó một dấu gạch ngang kép và tên tín hiệu:

#!/bin/bash bẫy "echo "Ctrl-C bị mắc kẹt."" SIGINT count=1 trong khi [ $count -le 5 ] làm echo "Loop #$count" sleep 1 count=$(($count + 1) ) xong bẫy -- SIGINT echo "Tôi vừa gỡ bỏ bẫy" count=1 while [ $count -le 5 ] do echo "Second Loop #$count" sleep 1 count=$(($count + 1)) done
Nếu tập lệnh nhận được tín hiệu trước khi bẫy bị hủy, nó sẽ xử lý tín hiệu đó như được chỉ định trong lệnh bẫy hiện tại. Hãy chạy tập lệnh:

$ ./myscript
Và nhấn CTRL + C trên bàn phím.


Tín hiệu bị chặn trước khi việc chặn bị hủy bỏ.

Lần nhấn CTRL + C đầu tiên xảy ra tại thời điểm thực thi tập lệnh, khi việc chặn tín hiệu có hiệu lực, do đó tập lệnh đã thực thi lệnh echo được gán cho tín hiệu. Sau khi thực thi đến lệnh unhook, lệnh CTRL + C hoạt động như bình thường, kết thúc tập lệnh.

Chạy tập lệnh dòng lệnh trong nền

Đôi khi các tập lệnh bash mất nhiều thời gian để hoàn thành một tác vụ. Tuy nhiên, bạn có thể cần có khả năng hoạt động bình thường trên dòng lệnh mà không cần đợi tập lệnh hoàn tất. Nó không khó để thực hiện.

Nếu bạn đã xem danh sách các tiến trình được xuất ra bằng lệnh ps, bạn có thể nhận thấy các tiến trình đang chạy ở chế độ nền và không được liên kết với thiết bị đầu cuối.
Hãy viết đoạn script sau:

#!/bin/bash count=1 while [ $count -le 10 ] ngủ 1 count=$(($count + 1)) xong
Hãy chạy nó bằng cách chỉ định ký hiệu dấu và (&) sau tên:

$ ./myscipt &
Điều này sẽ khiến nó chạy như một quá trình nền.


Chạy tập lệnh ở chế độ nền

Tập lệnh sẽ được khởi chạy trong một quy trình nền, mã nhận dạng của nó sẽ được hiển thị trong thiết bị đầu cuối và khi quá trình thực thi hoàn tất, bạn sẽ thấy một thông báo về điều này.

Lưu ý rằng mặc dù tập lệnh chạy ở chế độ nền nhưng nó vẫn tiếp tục sử dụng thiết bị đầu cuối để xuất thông báo tới STDOUT và STDERR, nghĩa là văn bản mà nó xuất ra hoặc thông báo lỗi sẽ hiển thị trong thiết bị đầu cuối.


Danh sách các quy trình

Với cách tiếp cận này, nếu bạn thoát khỏi terminal, tập lệnh chạy ẩn cũng sẽ thoát.

Nếu bạn muốn tập lệnh tiếp tục chạy sau khi đóng terminal thì sao?

Thực thi các tập lệnh không thoát khi đóng thiết bị đầu cuối

Các tập lệnh có thể được thực thi trong các tiến trình nền ngay cả sau khi thoát khỏi phiên cuối. Để làm điều này, bạn có thể sử dụng lệnh nohup. Lệnh này cho phép bạn chạy một chương trình bằng cách chặn các tín hiệu SIGHUP được gửi đến tiến trình. Do đó, quy trình sẽ được thực thi ngay cả khi bạn thoát khỏi thiết bị đầu cuối nơi nó được khởi chạy.

Hãy áp dụng kỹ thuật này khi chạy tập lệnh của chúng tôi:

Nohup ./myscript &
Đây là những gì sẽ được xuất ra thiết bị đầu cuối.


Đội Nohup

Lệnh nohup giải phóng một tiến trình khỏi thiết bị đầu cuối. Điều này có nghĩa là quy trình sẽ mất các tham chiếu đến STDOUT và STDERR. Để không làm mất dữ liệu đầu ra theo tập lệnh, nohup tự động chuyển hướng các tin nhắn đến STDOUT và STDERR sang tệp nohup.out.

Lưu ý rằng nếu bạn chạy nhiều tập lệnh từ cùng một thư mục, kết quả đầu ra của chúng sẽ ở một tệp nohup.out.

Xem bài tập

Lệnh jobs cho phép bạn xem các công việc hiện tại đang chạy trong shell. Hãy viết đoạn script sau:

#!/bin/bash count=1 while [ $count -le 10 ] thực hiện echo "Loop #$count" sleep 10 count=$(($count + 1)) xong
Hãy chạy nó:

$ ./myscript
Và tạm dừng nó bằng tổ hợp phím CTRL + Z.


Chạy và tạm dừng một tập lệnh

Hãy chạy cùng một tập lệnh ở chế độ nền, đồng thời chuyển hướng đầu ra của tập lệnh sang một tệp để nó không hiển thị bất cứ thứ gì trên màn hình:

$ ./myscript > tập tin ngoại vi &
Bây giờ thực thi lệnh jobs, chúng ta sẽ thấy thông tin về cả tập lệnh bị treo và tập lệnh đang chạy ở chế độ nền.


Lấy thông tin về script

Công tắc -l khi gọi lệnh jobs cho biết rằng chúng ta cần thông tin về ID tiến trình.

Khởi động lại công việc bị đình chỉ

Để khởi động lại tập lệnh ở chế độ nền, bạn có thể sử dụng lệnh bg.

Hãy chạy tập lệnh:

$ ./myscript
Nhấn CTRL + Z, thao tác này sẽ tạm thời dừng việc thực thi. Hãy chạy lệnh sau:

$bg


lệnh bg

Tập lệnh hiện đang chạy ở chế độ nền.

Nếu bạn có nhiều công việc bị tạm dừng, bạn có thể chuyển mã số công việc cho lệnh bg để khởi động lại một công việc cụ thể.

Để khởi động lại công việc một cách bình thường, hãy sử dụng lệnh fg:

Lập kế hoạch chạy script

Linux cung cấp một số cách để chạy tập lệnh bash tại một thời điểm nhất định. Đây là lệnh at và bộ lập lịch công việc định kỳ.

Lệnh at trông như thế này:

Tại thời điểm [-f filename]
Lệnh này nhận dạng nhiều định dạng thời gian.

  • Tiêu chuẩn, ví dụ như chỉ giờ và phút - 10:15.
  • Ví dụ: sử dụng chỉ báo AM/PM, trước hoặc sau buổi trưa - 10:15 tối.
  • Sử dụng các tên đặc biệt như bây giờ, trưa, nửa đêm.
Ngoài khả năng chỉ định thời gian thực hiện công việc, lệnh at còn có thể truyền ngày bằng một trong các định dạng được hỗ trợ.
  • Định dạng ngày tiêu chuẩn trong đó ngày được viết bằng các mẫu MMDDYY, MM/DD/YY hoặc DD.MM.YY.
  • Văn bản trình bày ngày, ví dụ: ngày 4 tháng 7 hoặc ngày 25 tháng 12, trong khi năm có thể được chỉ định hoặc bạn có thể làm mà không cần năm.
  • Ghi như bây giờ + 25 phút .
  • Ghi hình xem 22h15 ngày mai.
  • Loại ghi 10:15 + 7 ngày.
Chúng ta đừng đi sâu hơn vào chủ đề này, hãy xem xét một trường hợp sử dụng đơn giản cho lệnh:

$ tại -f ./myscript ngay bây giờ


Lập lịch công việc bằng lệnh at

Khóa chuyển -M khi gọi vào được sử dụng để gửi những gì tập lệnh xuất ra qua email nếu hệ thống được định cấu hình để làm như vậy. Nếu không thể gửi email, phím này sẽ chỉ chặn đầu ra.

Để xem danh sách các công việc đang chờ thực thi, bạn có thể sử dụng lệnh atq:


Danh sách nhiệm vụ đang chờ xử lý

Xóa công việc đang chờ xử lý

Lệnh atrm cho phép bạn xóa một công việc đang chờ xử lý. Khi gọi nó, hãy cho biết số nhiệm vụ:

$ atrm 18


Xóa một công việc

Chạy tập lệnh theo lịch trình

Lên lịch chạy tập lệnh của bạn một lần bằng lệnh at có thể giúp cuộc sống dễ dàng hơn trong nhiều trường hợp. Nhưng điều gì sẽ xảy ra nếu bạn cần tập lệnh được thực thi vào cùng một thời điểm mỗi ngày, mỗi tuần một lần hoặc mỗi tháng một lần?

Linux có tiện ích crontab cho phép bạn lên lịch các tập lệnh cần chạy thường xuyên.

Crontab chạy ở chế độ nền và dựa trên dữ liệu trong cái gọi là bảng cron, chạy các công việc đã lên lịch.

Để xem bảng công việc định kỳ hiện có, hãy sử dụng lệnh sau:

$ crontab –l
Khi lên lịch cho tập lệnh chạy theo lịch, crontab chấp nhận dữ liệu về thời điểm công việc cần được thực thi theo định dạng sau:

Phút, giờ, ngày trong tháng, tháng, ngày trong tuần.
Ví dụ: nếu bạn muốn một tập lệnh có tên lệnh được thực thi hàng ngày vào lúc 10:30, điều này sẽ tương ứng với mục sau trong bảng tác vụ:

30 10 * * * lệnh
Ở đây, ký tự đại diện "*" được sử dụng cho các trường ngày, tháng và ngày trong tuần cho biết rằng cron sẽ chạy lệnh hàng ngày vào lúc 10:30 sáng.

Ví dụ: nếu bạn muốn tập lệnh chạy lúc 4:30 chiều thứ Hai hàng tuần, bạn sẽ cần tạo mục sau trong bảng tác vụ:

30 16 * * 1 lệnh
Việc đánh số các ngày trong tuần bắt đầu từ 0, 0 nghĩa là Chủ Nhật, 6 nghĩa là Thứ Bảy. Đây là một ví dụ khác. Tại đây lệnh sẽ được thực thi vào lúc 12 giờ trưa ngày đầu tiên hàng tháng.

00 12 1 * * lệnh
Tháng được đánh số bắt đầu từ 1.
Để thêm một mục vào bảng, bạn cần gọi crontab bằng khóa chuyển -e:

Crontab –e
Sau đó, bạn có thể nhập các lệnh tạo lịch trình:

30 10 * * * /home/likegeeks/Desktop/myscript
Nhờ lệnh này, tập lệnh sẽ được gọi vào lúc 10:30 hàng ngày. Nếu bạn gặp lỗi "Tài nguyên tạm thời không khả dụng", hãy chạy lệnh bên dưới với quyền root:

$ rm -f /var/run/crond.pid
Bạn có thể tổ chức khởi chạy định kỳ các tập lệnh bằng cron thậm chí còn dễ dàng hơn bằng cách sử dụng một số thư mục đặc biệt:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Việc đặt một tệp tập lệnh vào một trong số chúng sẽ khiến nó chạy tương ứng hàng giờ, hàng ngày, hàng tuần hoặc hàng tháng.

Chạy tập lệnh khi đăng nhập và khởi động shell

Bạn có thể tự động hóa việc khởi chạy tập lệnh dựa trên các sự kiện khác nhau, chẳng hạn như đăng nhập của người dùng hoặc khởi chạy shell. Bạn có thể đọc về các tệp được xử lý trong những tình huống như vậy. Ví dụ: đây là các tệp sau:

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Để chạy tập lệnh khi đăng nhập, hãy thực hiện lệnh gọi tập lệnh đó trong tệp .bash_profile.

Còn việc chạy các tập lệnh khi bạn mở một thiết bị đầu cuối thì sao? Tệp .bashrc sẽ giúp bạn sắp xếp việc này.

Kết quả

Hôm nay chúng ta đã xem xét các vấn đề liên quan đến quản lý vòng đời tập lệnh, nói về cách chạy tập lệnh ở chế độ nền, cách lên lịch thực thi chúng. Lần tới, hãy đọc về các hàm trong tập lệnh bash và phát triển thư viện.

Gởi bạn đọc! Bạn có sử dụng các công cụ để lên lịch cho các tập lệnh dòng lệnh chạy theo lịch không? Nếu có, xin vui lòng cho chúng tôi biết về họ.

Về cơ bản, hệ điều hành bao gồm một hạt nhân và một bộ chương trình khổng lồ được thiết kế để thực hiện các tác vụ khác nhau, duy trì hệ thống và đáp ứng nhu cầu của người dùng. Hầu như mọi tương tác giữa người dùng và hệ điều hành đều được thực hiện thông qua các chương trình. Do đó, điều quan trọng là người mới bắt đầu phải hiểu cách chạy một chương trình trên Linux, điều gì xảy ra trong quá trình khởi động và các phương thức khởi chạy là gì.

Trước khi chuyển sang khởi chạy chương trình, trước tiên chúng ta phải hiểu chương trình là gì. Trong Linux, các chương trình khác với các tệp khác chỉ ở chỗ chúng có bộ cờ thực thi. Tôi đã viết chi tiết về điều này trong bài viết nên tôi sẽ không lặp lại.

Tất cả các chương trình có thể được chia thành nhiều loại:

  • Chương trình nhị phân- chứa các hướng dẫn cho bộ xử lý đã sẵn sàng để thực thi, hầu hết các chương trình đều ở định dạng này, chúng nhanh và được hệ thống thực thi ngay lập tức;
  • Chương trình mã byte- đây không còn là các lệnh của bộ xử lý nữa mà là các lệnh của một máy ảo cụ thể có thể thực thi chúng; nếu không có máy ảo thì các lệnh đó không thể được thực thi. Những chương trình như vậy tiêu tốn nhiều tài nguyên hơn nhưng cũng khá nhanh; ưu điểm của chúng là có thể được thực thi mà không cần sửa đổi ở bất cứ nơi nào máy ảo có thể chạy. Các chương trình như vậy bao gồm các chương trình Java.
  • Chương trình kịch bản- các chương trình này bao gồm một tập hợp các lệnh ở dạng văn bản thuần túy được thực thi bởi một trình thông dịch đặc biệt. Những chương trình như vậy chậm hơn nhưng dễ phát triển hơn và mã của chúng có thể được thay đổi dễ dàng và nhanh chóng.

Bây giờ hãy chuyển sang khởi chạy chương trình.

Chạy chương trình trong terminal

Ban đầu, hệ điều hành Unix và Linux không có giao diện đồ họa nên các chương trình được khởi chạy bằng lệnh từ thiết bị đầu cuối. Giờ đây, điều này cũng có thể thực hiện được và được người dùng có kinh nghiệm sử dụng khá tích cực. Cú pháp để khởi chạy chương trình trông như thế này:

/đường dẫn/đến/tập tin/chương trình tùy chọn

Các tham số chỉ được chỉ định khi cần thiết, nhưng shell phải luôn biết đường dẫn đầy đủ đến chương trình. Mọi thứ sau tên chương trình và khoảng trắng đều là tham số. Có thể bạn đã nhận thấy rằng chúng ta thường không chỉ định đường dẫn đầy đủ khi thực thi chương trình. Sẽ rất lâu và bất tiện.

Các nhà phát triển đã đưa ra một giải pháp thay thế. Một biến PATH đã được tạo, biến này lưu trữ tất cả các đường dẫn đến các thư mục thường chứa các chương trình - /bin, /sbin, /usr/bin, /usr/sbin, v.v. Bạn có thể xem nội dung của nó bằng lệnh:

Khi bạn nhập tên của một chương trình, hệ thống sẽ tìm kiếm tệp thực thi có tên đó trong tất cả các thư mục từ PATH và nếu tìm thấy nó, nó sẽ thực thi nó. Nếu không có tập tin đó, thông báo “không tìm thấy lệnh” sẽ được hiển thị. Do đó, để khởi chạy một trong các chương trình hệ thống, chỉ cần nhập tên tệp thực thi của nó, ví dụ:

Và bạn có thể truyền tham số sau dấu cách:

Khi chương trình không có trong các thư mục này, bạn cần chỉ định đường dẫn đầy đủ đến nó:

/usr/local/bin/ls1

Nếu bạn muốn chạy chương trình thông qua thiết bị đầu cuối Ubuntu, nằm trong thư mục hiện tại, thì tình huống sẽ hơi khác một chút. Hệ thống chỉ tìm kiếm các thư mục trong biến PATH; nó không tìm kiếm thư mục hiện tại. Vì vậy, nếu gõ tên file thực thi bạn sẽ gặp lỗi. Bạn cần chỉ định đường dẫn đầy đủ, như bạn nhớ./:

Đôi khi cần phải chuyển một số tệp . Ví dụ: biến EDITOR chỉ định trình soạn thảo văn bản nào sẽ được sử dụng theo mặc định. Bạn có thể chỉ định tên biến và giá trị của nó trước tên lệnh bằng cú pháp:

biến_name = lệnh giá trị

Ví dụ:

EDITOR=visudo nano

Theo mặc định, lệnh này sẽ mở cài đặt trong trình soạn thảo Vim, nhưng với biến môi trường này, cài đặt sẽ mở trong trình chỉnh sửa nano.

Chạy chương trình với tư cách người dùng khác

Bạn đã biết cách chạy một chương trình trên thiết bị đầu cuối Linux, nhưng còn những người dùng khác thì sao? Trong Windows, việc chạy các chương trình với tư cách quản trị viên là điều khá phổ biến để chương trình có thể có thêm quyền truy cập vào hệ thống. Trên Linux, tiện ích sudo được sử dụng cho việc này. Tên của cô ấy có thể được giải mã là S phù thủy bạn ser LÀM- thay đổi người dùng và thực thi. Theo mặc định, tiện ích chạy lệnh với tư cách là siêu người dùng gốc:

lệnh sudo
sudo whoami

Nhưng bằng cách sử dụng tùy chọn -u, bạn có thể chạy chương trình với tư cách bất kỳ người dùng nào đăng nhập vào hệ thống:

lệnh tên người dùng sudo -u
sudo -u postgres whoami

Lệnh whoami (tôi là ai) hiển thị tên của người dùng hiện tại.

Cách chạy chương trình ở chế độ nền

Đôi khi cần phải chạy một chương trình chạy dài trong thiết bị đầu cuối để nó không cản trở công việc tiếp theo. Để thực hiện việc này, bạn có thể sử dụng chương trình chạy nền trên Linux:

tên chương trình &

Ví dụ:

dd if=/dev/zero of=~/file count=100000 &

Hệ thống sẽ xuất ra PID, mã định danh duy nhất của chương trình, sau đó bạn có thể sử dụng mã này để đóng nó:

Cách chạy tập lệnh trên Linux

Chúng tôi đã nói rằng các chương trình được chia thành nhị phân và được giải thích. Trước đây chúng ta chỉ nói về chương trình nhị phân. Để chạy các chương trình thông dịch, bạn cần có một trình thông dịch trực tiếp; những chương trình như vậy bao gồm những chương trình được viết bằng các ngôn ngữ như Java, Python, Perl, Ruby, PHP, NodeJS và nhiều ngôn ngữ khác. Cú pháp để khởi chạy một chương trình như vậy là khác nhau:

thông dịch viên /đường dẫn/đến/tập tin/chương trình tùy chọn

Các trình thông dịch khác nhau hoạt động khác nhau, vì vậy tốt hơn là bạn nên chỉ định ngay đường dẫn đầy đủ đến chương trình. Python thường lấy các tập lệnh từ thư mục hiện tại mà không chỉ định đường dẫn đầy đủ:

trăn hellowrld.py

Và các chương trình Java cần được khởi chạy như thế này:

java -jar chương trình.jar

Đối với các tệp chương trình được giải thích, cờ thực thi là tùy chọn vì chúng được chuyển dưới dạng tham số cho chương trình chính. Chỉ có tập lệnh Bash là ngoại lệ. Bạn có thể chạy tập lệnh bằng trình thông dịch:

Hoặc chỉ cần gõ đường dẫn đến tập lệnh:

Bản thân shell xác định các tập lệnh của nó bằng cờ thực thi và thực thi chúng. Nếu cờ thực thi chưa được đặt thì bạn nên thêm nó:

Sudo chmod u+x ./script.sh

Do đó, đối với hầu hết các chương trình được dịch, các tập lệnh sh đơn giản đã được tạo để có thể khởi chạy nhanh chóng.

Chạy các chương trình Linux trong GUI

Sẽ thuận tiện hơn nhiều khi chạy các chương trình thông qua giao diện đồ họa. Nếu không thể khởi chạy các chương trình bảng điều khiển theo cách này, thì có các phím tắt cho tất cả các tiện ích đồ họa mà bạn có thể tìm thấy trong menu chính của hệ thống:

Ngoài ra, bạn có thể chạy chương trình từ trình quản lý tệp bằng cách nhấp đúp chuột, nhưng sau đó phải đặt cờ thực thi cho chương trình.

Việc chạy các tập lệnh trong GUI hoạt động theo cách tương tự. Bạn có thể tìm thấy tất cả các phím tắt menu trong thư mục /usr/share/applications/. Bất kỳ chương trình nào cũng có thể được khởi chạy bằng cách nhấp đúp vào đây. Nhưng hãy xem bên trong phím tắt có gì; để thực hiện việc này, hãy mở nó trong trình soạn thảo văn bản:


Trong số những thứ khác, dòng Exec chứa lệnh chạy chương trình linux khi bạn nhấp đúp vào phím tắt. Bạn có thể sử dụng một trong các phím tắt hiện có và tạo phím tắt của riêng mình dựa trên nó. Đây chỉ đơn giản là tên của chương trình. Nhưng điều quan trọng cần lưu ý là tốt hơn nên chỉ định đường dẫn đầy đủ ở những nơi như phím tắt, tập lệnh, cron, v.v., điều này sẽ giảm số lượng lỗi, vì bạn không thể biết liệu hệ thống trong trường hợp này đang kiểm tra PATH hay chỉ tìm kiếm chương trình trong thư mục hiện tại. Bây giờ bạn đã biết mọi thứ về cách chạy một chương trình trên Linux.

kết luận

Trong bài viết này, chúng tôi đã xem xét cách chạy chương trình thông qua thiết bị đầu cuối Ubuntu hoặc trong các bản phân phối Linux khác. Mặc dù đây có vẻ là một chủ đề rất đơn giản nhưng vẫn có một số điểm thú vị có thể hữu ích. Nhưng bạn đã biết về họ. Nếu bạn có bất kỳ câu hỏi nào, hãy hỏi trong phần bình luận!