Sự khác biệt giữa các lệnh Halt và Shutdown là gì?


Câu trả lời:


77

Nói chung, một người sử dụng shutdownlệnh . Nó cho phép trì hoãn thời gian và thông báo cảnh báo trước khi tắt hoặc khởi động lại, điều này rất quan trọng đối với việc quản trị hệ thống của các máy chủ shell nhiều người dùng; nó có thể cung cấp cho người dùng thông báo trước về thời gian chết.

Do đó, lệnh tắt máy phải được sử dụng như thế này để tạm dừng / tắt máy tính ngay lập tức (ít nhất là trên Linux và FreeBSD):

shutdown -h now

Hoặc để khởi động lại nó với một cảnh báo trước 30 phút tùy chỉnh:

shutdown -r +30 "Planned software upgrades"

Sau khi trì hoãn, shutdownyêu initcầu thay đổi thành runlevel 0 (tạm dừng) hoặc 6 (khởi động lại). (Lưu ý Không ghi rằng -hhoặc -rsẽ làm cho hệ thống đi vào chế độ single-user (runlevel 1), mà giết chết hầu hết các quy trình hệ thống nhưng không thực sự ngăn chặn hệ thống, nó vẫn cho phép người quản trị để vẫn đăng nhập bằng root.)

Khi các quy trình hệ thống đã bị hủy và các hệ thống tập tin đã bị ngắt kết nối, hệ thống sẽ dừng / tắt nguồn hoặc tự động khởi động lại. Điều này được thực hiện bằng cách sử dụng lệnh halthoặcreboot , đồng bộ hóa các thay đổi thành đĩa và sau đó thực hiện tạm dừng / tắt nguồn hoặc khởi động lại thực tế.

Trên Linux, nếu halthoặc rebootđược chạy khi hệ thống chưa bắt đầu quá trình tắt máy, nó sẽ shutdowntự động gọi lệnh thay vì thực hiện trực tiếp hành động dự định của nó. Tuy nhiên, trên các hệ thống như FreeBSD , các lệnh này trước tiên đăng nhập hành động wtmpvà sau đó sẽ ngay lập tức thực hiện tạm dừng / khởi động lại, mà không cần xử lý trước các quy trình hoặc ngắt kết nối hệ thống tập tin.


Lời giải thích hay!

18
Sầu nhưng giờ đã hết hạn. Trên các hệ điều hành Linux hệ thống, các lệnh này tồn tại (theo cách nói của tài liệu hệ thống) "chỉ để tương thích". Không có riêng biệt halt, rebootshutdowncác chương trình gọi nhau. Có một chương trình duy nhất, với rất nhiều trình phân tích cú pháp dòng lệnh đi vào một đường dẫn mã bên trong. Cũng không có cấp chạy. Cũng không tắt máy đi vào một chế độ người dùng. Thật vậy, chế độ người dùng đơn lẻ đã được đổi tên. Để biết chi tiết, xem unix.stackexchange.com/a/196014/5132 .
JdeBP

49

Quá khứ

Trong những năm 1980, các BSDs có halt, rebootshutdown. Hệ thống 5 UNIX có bộ công cụ tương thích BSD. Nhưng thực chất nó có shutdownmệnh lệnh riêng, khác biệt ; và không có halthoặc có reboottất cả. (Một số biến thể của Hệ thống 5 có những thứ như SCO XENIX haltsys.)

BSD haltrebootcác lệnh là cấp thấp, quyết liệt và ngay lập tức. Các chu đáo cách để đóng cửa một hệ thống BSD là shutdownlệnh, mà đã làm tất cả những điều mà ai hy vọng sẽ xảy ra: wallcác thông điệp cho người dùng, dịch vụ một cách duyên dáng thiệt mạng, các mục văn bản đăng nhập, đăng nhập vô hiệu hóa, và vân vân.

Trong khi các BSD chủ yếu là nơi trí tuệ nhận được bắt nguồn từ " shutdownexecs halt/ reboot", và cái sau được sử dụng một cách cẩn thận; đó là thế giới Hệ thống 5 nơi mọi người học được thói quen trái ngược đó halt/ rebootchỉ là những tốc ký tiện dụng và không có gì khác : /usr/ucb/halt, từ "Gói tương thích BSD", không có hiệu lực khác shutdown -h. Cả hai cuối cùng đã làm init 0.

đọc thêm

Hôm nay

Ngày nay, chúng ta có một loạt các bộ công cụ quản lý hệ thống có thể. Các BSD vẫn có bộ công cụ của họ, mặc dù đã thanh trừng bất kỳ AT & Tism nào có thể trong những năm 1990. Miquel van Smoorenburg năm 1992 (lại) đã viết một Linux init+ rcvà các công cụ liên quan của họ, mà bây giờ mọi người gọi là "System 5 init", mặc dù nó không thực sự là phần mềm từ UNIX System 5 (và không chỉ là init). Ngoài ra còn có systemd , mới nổi , và quà vặt , mỗi trong số đó có việc triển khai của mình của halt, reboot, fasthalt, fastboot, và vân vân.

Các bộ công cụ cũng đã phát triển và thay đổi. Giờ đây đã có powerofflệnh, không có mặt trong các hệ điều hành những năm 1980 bởi vì Bộ xử lý trung tâm trên hầu hết các máy hiện đại không có cách nào kiểm soát nguồn cung cấp năng lượng của chúng. Các bộ công cụ Linux nói riêng đã thu hút các lệnh BSD; nhưng giống như các công cụ tương thích BSD trên Hệ thống UNIX 5, chúng không phải là công việc chính xác và mọi thứ hầu như đã bị san phẳng.

Phẳng này đã đưa chúng tôi đến điểm nơi haltshutdownchủ yếu là giống nhau. Nhưng các chi tiết chính xác khác nhau từ bộ công cụ đến bộ công cụ và cơ chế của mỗi bộ công cụ đều hơi khác nhau.

Nó cũng đã đưa chúng tôi đến vị trí hơi lúng túng nơi đặt lệnh này đã trở nên trang trí với các tùy chọn tương thích mà nó bây giờ cho phép người để cung cấp cho máy tính hướng dẫn tự mâu thuẫn như reboot --haltpoweroff --reboot, như tôi đã nêu trong trang hướng dẫn cho quà vặt halt, fasthalt, reboot, fastboot, và poweroffcác lệnh. ☺

Bộ công cụ systemd

halt, reboot, poweroff, telinit, Và shutdowntất cả một chương trình . Đó thực sự là systemctlchương trình của systemd . Nó có một số trình phân tích cú pháp dòng lệnh cho các cú pháp dòng lệnh khác nhau của các lệnh đó, cũng như của chính nó, nhưng sau đó phần lớn chuyển vào một đường dẫn mã bên trong. Không có sự khác biệt giữa việc sử dụng haltvà các tùy chọn lệnh của nó để kích hoạt một hành động và sử dụng shutdownvà các tùy chọn lệnh của nó để kích hoạt cùng một hành động.

systemd không coi chế độ cứu hộ (đó là những gì mà người systemd đã đổi tên thành chế độ người dùng đơn ) thành trạng thái tắt hệ thống và không thể truy cập được với bất kỳ lệnh nào trong số này. Tùy chọn ít shutdown nowgiống như poweroff.

Đọc thêm:

BSD

Các BSD phần lớn giữ lại ngữ nghĩa của thập niên 1980. haltshutdowndo đó rất nhiều không tương đương trong bộ công cụ của họ. haltrebootlà một chương trình duy nhất; và vẫn còn ở mức độ thấp, ngay lập tức và quyết liệt. Trong khi đó shutdown, và poweroffcũng là một chương trình duy nhất, thực hiện tất cả những việc quan tâm như tắt máy theo lịch trình, viết walltin nhắn, hành động đăng nhập, vô hiệu hóa đăng nhập, v.v.

Trong các bộ công cụ BSD, shutdown/ powerofftheo truyền thống cuối cùng đã gọi halt/ rebootđể ban hành thay đổi trạng thái hệ thống cuối cùng. (Thường không chính xác ngày nay) đã nhận được sự khôn ngoan rằng " shutdownexecs halt/ reboot" trên thực tế vẫn còn giữ trên NetBSD và OpenBSD. Nhưng trên FreeBSD / TrueOS / DragonFlyBSD thì chỉ có trường hợp nếu -otùy chọn được sử dụng. Trên các BSDs, cả các chương trình này thường ban hành các thay đổi trạng thái hệ thống chính thức bằng cách gửi tín hiệu khác nhau ( INT, USR1USR2) để xử lý # 1. initthực hiện tất cả các quản lý trạng thái hệ thống trên trên các hệ thống này.

Trên tất cả trong số họ, tùy chọn ít shutdown nowlà không tương đương với bất kỳ halt, reboothoặc poweroff. Nó chuyển sang BSD chế độ người dùng đơn lẻ , từ đó người ta có thể chuyển trở lại để chế độ đa người dùng .

Đọc thêm:

  • shutdown. Hướng dẫn quản lý hệ thống . Các trang hướng dẫn NetBSD. 2011-11-04.
  • reboot,halt . Các trang hướng dẫn OpenBSD. 2016-09-03.
  • shutdown. Trang hướng dẫn FreeBSD. 2016-09-21.
  • reboot, halt, fastboot,fasthalt . Trang hướng dẫn FreeBSD. 2017/03/19.
  • shutdown. Hướng dẫn quản lý hệ thống . Các trang hướng dẫn DragonFlyBSD. 2016-09-29.
  • reboot, halt, fastboot,fasthalt . Hướng dẫn quản lý hệ thống . Các trang hướng dẫn DragonFlyBSD. 2016-09-29.

Bộ công cụ nosh

Trong quà vặt công cụ quản lý hệ thống, halt, fasthalt, poweroff, fastpoweroff, reboot, và fastbootlà tất cả một chương trình. Đó là một sự tương thích ngược mà thường đơn giản là xiềng xích shutdown, ngược lại với sự khôn ngoan nhận được. Các --forcetùy chọn làm cho nó chuỗi system-controlthay thế.

Vì vậy, không có sự khác biệt (vắng mặt --force) giữa haltlệnh và shutdownlệnh (với tùy chọn tương đương) trong bộ công cụ này, vì bộ lệnh "tương thích BSD / Hệ thống 5" này chỉ đơn giản là một lớp shim mỏng trên đầu shutdown.

Đọc thêm:

Bộ công cụ mới nhất

Giống như với nosh, trong bộ công cụ quản lý hệ thống mới nhất, ngược lại với sự khôn ngoan của BSD được áp dụng. halt, rebootpowerofflà tất cả một chương trình, mà thường chuỗi shutdown; trừ khi --forcetùy chọn được sử dụng, làm cho nó làm cho reboot()hệ thống tự gọi.

Vì vậy, một lần nữa, không có sự khác biệt (vắng mặt --force) giữa haltlệnh và shutdownlệnh (với tùy chọn tương đương) trong bộ công cụ này. Ngoài ra, một lần nữa, tùy chọn ít hơn shutdown now(mà không ai trong số halt, reboothoặc poweroffcó thể kết thúc bằng cách gọi tất cả các tùy chọn đã đặt) đưa hệ thống vào chế độ người dùng duy nhất thay vì tắt nó.

Đọc thêm:

Bộ công cụ Linux System 5 init+rc

Một lần nữa, trong bộ công cụ này trái ngược với nhận sự khôn ngoan BSD áp dụng và haltrebootchỉ đơn giản là chuỗi shutdown- trừ khi hệ thống đã có trong poweroff hoặc dừng lại "run-cấp", trong trường hợp các lệnh này thực sự ban hành sự thay đổi trạng thái hệ thống chính thức. shutdowntrong lượt của nó chuỗi đến init.

Vì vậy, một lần nữa, không có sự khác biệt (trừ khi hệ thống đã ngừng hoạt động phần lớn) giữa haltshutdownbởi vì cái trước chỉ gọi cái sau. Và vâng, một lần nữa, không có tùy chọn shutdown now(mà không ai trong số đó halt, reboothoặc poweroffcó thể kết thúc bằng cách gọi tất cả các tùy chọn) đưa hệ thống vào chế độ người dùng duy nhất thay vì tắt nó.


Đây là lý do tại sao hệ thống bỏ phiếu không hoạt động khi 80% số cử tri
ychaouche

Bạn nói rằng: "tạm dừng và khởi động lại là một chương trình duy nhất và vẫn ở mức độ thấp, ngay lập tức và quyết liệt", điều này dường như không phải là trường hợp. Tôi đang trích dẫn trang tạm dừng từ dragonflyBSD có nội dung: Các tiện ích tạm dừng và khởi động lại sẽ xóa bộ đệm của hệ thống tệp vào đĩa, gửi tất cả các quy trình đang chạy SIGTERM (và sau đó là SIGKILL) và, tương ứng, tạm dừng hoặc khởi động lại hệ thống. Hành động được ghi lại, bao gồm nhập bản ghi tắt vào tệp wtmp (5). Xem: dragonflybsd.org/cgi/web-man?command=halt§ion=ANY
ychaouche

Bây giờ hãy đi và đọc câu trả lời một lần nữa, cho một bộ đã được đưa ra rõ ràng (hai lần) những thứ không có trong danh sách đó; một trong đó cũng được đánh vần trong hướng dẫn sử dụng của quản trị viên hệ thống của BSD.
JdeBP

danh sách nào @JdeBP?
ychaouche

11

Tôi nghi ngờ điều này phần nào phụ thuộc vào phiên bản UNIX / Linux mà bạn đang sử dụng. Trên Centos (và tôi triển khai các Linux hiện đại khác) tạm dừng cuộc gọi (với điều kiện bạn không ở runlevel 0 hoặc 6) để hệ thống của bạn sẽ được tắt sạch. Trên Solaris 10 tạm dừng tàn bạo hơn, nó chỉ xóa bộ nhớ cache và tắt nguồn hệ thống - không có nỗ lực nào để chạy bất kỳ tập lệnh hoặc tắt các thiết bị smf .


2

Đối với những người sử dụng AWS EC2: trên AWS shutdown dừng một thể hiện, khi halt chấm dứt nó.


Sự khác biệt giữa dừngchấm dứt là gì?
roaima

Đó là chủ đề hoàn toàn khác, ở ngoài kia, đó là lý do tại sao tôi không đề cập đến nó. Nhưng bạn có thể xem trên docs.aws.amazon.com/AWSEC2/latest/UserGuide/ mẹo
dveim

1
Vì vậy, trong câu trả lời của bạn, bạn đang nói rằng dừng thực hiện những gì được nói và dừng cá thể, trong khi tạm dừng (hoặc theo thuật ngữ thay thế của bạn, chấm dứt ) dừng trường hợp đó và xóa nó.
roaima

Đúng. Nhưng đó là đặc thù AWS.
dveim

Ah. Tôi hiểu rồi. OP đã không cung cấp bối cảnh. Bạn có. Cảm ơn.
roaima

0

Trong linux, "tạm dừng" và "khởi động lại" là bí danh của lệnh tắt máy - shutdown -hshutdown -rtương ứng. Bareword tắt máy thường giả định -h.


10
Chúng không phải aliaseslà ý nghĩa của bí danh vỏ, nhưng vâng, haltvề cơ bản chỉ là các cuộc gọi shutdown -hrebootchạy shutdown -r. Lưu ý rằng nếu bạn vượt qua các -ftùy chọn (có hiệu lực) để halthoặc reboot, shutdownkhông gọi.
Mikel

Trên thực tế, mặc dù vẫn còn sai, nhưng trên các hệ điều hành systemd, mô tả của Shadur ở đây gần với sự thật hơn là sự điều chỉnh của Mikel. Không có "A chỉ gọi B". Chúng đều là những cách khác để gọi một chương trình duy nhất , như được giải thích chi tiết hơn tại unix.stackexchange.com/a/196014/5132 .
JdeBP

@JdeBP Quay lại khi tôi viết systemd này đã ra mắt chưa đầy một năm và tôi thậm chí chưa bao giờ nghe về nó. :)
Shadur

1
@JdeBP Tôi muốn đánh đồng chúng, giả sử, sendmaillệnh tại thời điểm này - Giống như với MTA, thực sự không quan trọng bạn sử dụng hệ thống init nào vì tất cả chúng sẽ nhận ra cả hai shutdownhaltnhư vậy.
Shadur

1
Trên thực tế, nó có vấn đề; bởi vì có sự khác biệt tinh tế và thực sự không tinh tế giữa các bộ công cụ. Trớ trêu thay, đó cũng là trường hợp với sendmaillệnh. Nó giống như sendmailmệnh lệnh, nhưng không phải theo cách bạn nghĩ.
JdeBP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.