Làm cách nào để tắt máy chủ Linux sau khi chạy 60 phút?


18

Tôi có một máy chủ mà nó thường bị tắt vì lý do bảo mật. Khi tôi muốn làm việc với nó, tôi bật nó lên, thực hiện các nhiệm vụ của mình và tắt nó lại. Nhiệm vụ của tôi thường mất không quá 15 phút. Tôi muốn thực hiện một cơ chế để tự động tắt sau 60 phút.

Tôi đã nghiên cứu cách thực hiện việc này với cron, nhưng tôi không nghĩ đó là cách thích hợp vì cron không tính đến khi máy chủ được bật lần cuối. Tôi chỉ có thể đặt các mẫu định kỳ, nhưng họ không tính đến dữ liệu đó.

Làm thế nào tôi có thể thực hiện việc này?


4
Có một cái nhìn at(thực hiện một lần).
dirkt

14
Tôi đã không làm điều này, nhưng tập lệnh đăng nhập của bạn có thể bắt sudo shutdown -h +60đầu một bộ đếm bắt đầu đếm ngược 60 phút cho quá trình tắt máy (-halt). Nếu bạn muốn hủy nó, bạn có thể sudo shutdown -c (điều này không sử dụng cron)
guiverc

7
Tùy thuộc vào bản chất của các nhiệm vụ của bạn, có thể đáng để chạy chúng trong thùng chứa docker, vì vậy bạn không cần phải lo lắng về việc tắt máy chủ. Container được tạo, nó chạy các nhiệm vụ của bạn và sau đó nó bị phá hủy.
Vicente Olivert Riera

6
Đừng mong đợi bất kỳ lợi ích bảo mật thực sự từ điều này. Hầu hết các lỗ hổng có thể bị khai thác trong chưa đầy một giây, do đó, việc tắt nguồn sau một giờ sẽ không ngăn được việc khai thác. Và một kẻ tấn công đã tìm thấy một lỗ hổng có thể chờ bạn bật nguồn máy để thực hiện cuộc tấn công.
kasperd

2
Re: bình luận của @kasperd, tôi sẽ viết lại nó như nói rằng bạn cần chính xác cùng một lượng bảo mật trên máy chủ của mình bất kể nó thực sự trực tuyến nhiều hay ít. Lưu ý, đó là một máy chủ để nó được kết nối với một cái gì đó và điều đó có nghĩa là một cái gì đó sẽ biết khi nó được bật - quét tự động không phải là điều bạn lo lắng, đó là kết nối dưới mọi hình thức và bạn không thể tránh điều đó để bảo mật tối đa mọi lúc cách duy nhất.
StephenG

Câu trả lời:


23

Nếu bạn thực hiện các tác vụ của mình với cùng một người dùng mỗi lần, bạn chỉ cần thêm lệnh tắt máy, tùy chọn với tùy chọn -P, vào hồ sơ của bạn. Số này là viết tắt của số phút lệnh tắt máy bị trì hoãn. Đảm bảo người dùng của bạn có khả năng thực thi lệnh tắt máy thông qua sudo mà không cần mật khẩu.

echo "sudo shutdown -P +60" >> ~/.profile

11
Thời gian tính bằng phút chứ không phải giây. Thử shutdown -k -P 3600vs shutdown -k -P 60( -kin tin nhắn trên tường nhưng không có tác dụng khác)
sebasth

12
Nhưng hãy thử lệnh một lần đầu tiên, bạn không muốn tắt máy ngay lập tức bị ràng buộc với hồ sơ của bạn!
Fabian Röling

17
Tôi tưởng tượng mỗi lần đăng nhập ssh sẽ gây ra một cuộc gọi tắt máy mới. Bộ đếm sẽ thiết lập lại sau đó?
JoL

4
Cũng có thể đáng để đề cập rằng đăng nhập sẽ không được phép trong 5 phút cuối, như đã đề cập trong trang quản lý tắt máy.
JoL

6
Lưu ý rằng 60 phút sau khi đăng nhập không giống với 60 phút sau khi khởi động. Điều gì nếu bạn khởi động máy và sau đó quên đăng nhập?
Hagen von Eitzen

69

Có một vài lựa chọn.

  • Cung cấp thời gian trực tiếp đến shutdown -P:

    shutdown -P +60
    

    Lưu ý rằng shutdown trang man cũng chỉ ra:

    Nếu đối số thời gian được sử dụng, 5 phút trước khi hệ thống chuyển xuống tệp / run / nologin được tạo để đảm bảo rằng các thông tin đăng nhập tiếp theo sẽ không được phép.

  • Sử dụng atlệnh.

  • Tạo một tập tin đơn vị systemd hoặc init script chạy shutdown -P 60khi khởi động.

  • Sử dụng cron's @rebootđể chạy lệnh sau khi khởi động.

    Thêm vào (root) crontab:

    @reboot shutdown -P +60
    

Đối với hai phương pháp cuối cùng, bạn cũng có thể sử dụng sleep 3600 && shutdown -P nowthay vì sử dụng đối số thời gian shutdownđể trì hoãn tắt máy trong 60 phút. Cách đăng nhập này có thể đến giây phút cuối cùng trước khi tắt máy.


2
Tôi nghĩ với sleeplệnh, bạn vẫn cần chỉ định thời gian shutdown- chúng tôi muốn sử dụng nowcho đối số đó nếu chúng tôi đã chờ đợi (nhưng lưu ý rằng bạn sẽ không nhận được nhiều cảnh báo để lưu công việc của mình trước nó biến mất từ ​​dưới bạn!).
Toby Speight

1
Mặc dù shutdown -P 60hoạt động nhưng nó không phải là cách mà lệnh nên được gọi. Theo trang người đàn ông bạn nên sử dụng shutdown -P +60. --- Ngoài ra, tắt máy mà không có đối số thời gian (trong ví dụ sleep 3600 && shutdown -P) sẽ bị trì hoãn sau một phút (như shutdown -P +1). Như Toby Speight đã viết, có lẽ bạn sẽ muốn sử dụng shutdown -P now.
pabouk

34

Điều này trông giống như một vấn đề XY .

Nhiệm vụ của tôi thường mất không quá 15 phút. Tôi muốn thực hiện một cơ chế để tự động tắt nó sau 60 phút.

Nếu bạn tắt máy sau 60 phút, bạn có nguy cơ gặp phải sự cố đặc biệt phức tạp và chỉ cần có thêm thời gian. Nhiều giải pháp trước đây sẽ không dễ dàng trì hoãn việc tắt máy.

Nếu tác vụ không phải là một tác vụ tương tác, mà thay vào đó là một tác vụ theo kịch bản được tự động kích hoạt từ một máy khác, @sdkks đã đưa ra một giải pháp tuyệt vời cho điều đó; bạn thực sự chỉ nên giao nhiệm vụ cho máy chạy poweroff ngay khi tập lệnh và tất cả các tác vụ của nó kết thúc.

Tuy nhiên, nếu nhiệm vụ của bạn là một nhiệm vụ tương tác, thay vào đó tôi khuyên bạn nên thực hiện phát hiện nhàn rỗi.

Nếu bạn thực hiện nhiệm vụ của mình trong GUI (X11), bạn có thể phát hiện các phiên GUI nhàn rỗi bằng cách sử dụng phương pháp được mô tả ở đây: Chạy lệnh khi hệ thống không hoạt động và khi hoạt động trở lại

Nếu bạn thực hiện tác vụ thông qua một thiết bị đầu cuối, bạn có thể phát hiện người dùng đã đăng nhập bằng wholệnh. Bạn có thể thiết lập một cronjob tắt máy nếu whotrả về kết quả trống. Lưu ý rằng đây sẽ là một cách tiếp cận khá bảo thủ; nó sẽ không tắt hệ thống nếu bạn để giao diện điều khiển được kết nối, nhưng không hoạt động.

Nếu bạn muốn tích cực hơn một chút và ngắt kết nối các phiên cuối của thiết bị đầu cuối nhàn rỗi, bạn có thể kết hợp cách tiếp cận trước đó với tự động ngắt kết nối các phiên SSH nhàn rỗi ClientAliveIntervalClientAliveCountMax. Một cách tiếp cận khác cho điều này nếu bạn không có SSH, nhưng có phiên thiết bị đầu cuối cục bộ, là sử dụng thời gian nhàn rỗi của thiết bị đầu cuối như được trả về bởi wlệnh.


2
Đây là một điểm rất quan trọng. Bất cứ điều gì bạn thực hiện - đó là lợi ích của bạn để đảm bảo rằng bạn cũng có thể hủy bỏ việc tắt máy.
Bóng tối

1
Đã xảy ra lỗi nếu nó vẫn chạy ở 60m, vì vậy có lẽ chỉ cần bắt đầu lại. Điều này có thể rất tốn kém cho đám mây. Không đảm bảo tắt máy trong một dịp khiến tôi phải trả lại hơn 4.000 đô la.
mckenzm

8

Mặc dù các câu trả lời trước đây ở đây đều đáp ứng yêu cầu về sự hoàn hảo, bạn cũng có thể tắt máy ngay khi hoàn thành nhiệm vụ.

bashtập lệnh có thể là trapped, nghĩa là một số tín hiệu có thể bị chặn và một số tác vụ nhất định có thể được thực thi khi cần. EXITlà một trong những tín hiệu có thể bị mắc kẹt.

Bạn sẽ có thể:

  1. Đặt trapcho EXITcác tập lệnh shell tự động của bạn, nghĩa là chấm dứt các tác vụ tự động của bạn
  2. Đặt trapcho bạn .bashrc EXIT, nghĩa là bất cứ khi nào bạn đăng xuất khỏi máy đó, tắt nguồn.

Tùy chọn # 1 sẽ là trường hợp lý tưởng, miễn là các nhiệm vụ của bạn không yêu cầu kiểm tra adhoc và phán đoán thủ công.

Tùy chọn # 2 sẽ bao gồm các trường hợp bạn quên thoát khỏi thiết bị đầu cuối mà không tắt nguồn. Có một cảnh báo mặc dù; nếu bạn có nhiều thiết bị đầu cuối cho cùng một máy mở và bạn thoát khỏi một trong số chúng, nó vẫn sẽ tắt nguồn máy như nhau. (Có thể viết kịch bản để tránh điều đó, nhưng tôi sẽ không làm phức tạp hóa giải pháp.)

cleanup(){
    # Do some tasks before terminating
    echo oh la la, cleaning is so nice
    echo "See you later, world"
    sudo poweroff & # finally shutdown
}
trap cleanup EXIT

Điều này có thể ở cuối .bashrctùy chọn # 2, ở đâu đó ở đầu tập lệnh của bạn cho tùy chọn # 1.

Tại sao không sử dụng poweroffở cuối tập lệnh?

Tôi thích sử dụng set -eo pipefailở trên cùng của kịch bản của tôi. Nếu có lỗi xảy ra, nó sẽ không âm thầm thất bại; nó sẽ dừng thực thi nhiều lệnh hơn. trapcủa EXITtín hiệu sẽ bao gồm các trường hợp tập lệnh kết thúc sớm do lỗi.

Tuy nhiên, đối với nhiệm vụ của bạn, điều này cũng có nghĩa là máy sẽ tắt trước khi hoàn thành.

Tôi có một bashmẫu đơn giản mà tôi sử dụng để làm cho kịch bản dễ gỡ lỗi hơn; có lẽ nó có thể được sử dụng Xin vui lòng xem ý chính này .


Đồng ý, và để chắc chắn có thể một thời gian trong ngày tắt máy từ cron. Đây là phanh của một người chết.
mckenzm

@ Abigail cho kịch bản, nó phải ở trên, vì .bashrctôi thích phần dưới hơn trong trường hợp có cái gì đó ghi đè lên nó. Mối quan tâm của bạn không có vẻ rõ ràng, bạn có thể chia sẻ một đoạn ví dụ trên repl.it có thể không?
sdkks

@mckenzm Tôi không hiểu. Bạn có thể chia sẻ mã mẫu hoặc giải thích thêm?
sdkks

5

Xây dựng trên bình luận @dirkt, bạn có thể chèn một atlệnh trên của bạn .bashrchoặc .profilehoặc bất cứ tập tin sử dụng vỏ của bạn trên đăng nhập để sắp xếp một cuộc tắt máy tự động 60 phút sau khi đăng nhập của bạn.

Cái gì đó như:

at now + 60 minutes -f /sbin/halt

Nhiệm vụ này nằm ngay trên atcon hẻm. Bạn cũng có thể thấy atcác nhiệm vụ trong/var/spool/
sdkks

5
Tôi sẽ khuyên không nên sử dụng attrong bối cảnh này vì nó vẫn còn tồn tại. Nếu OP đăng nhập, tắt máy thủ công và sau đó đăng nhập lại sau một giờ, anh ta sẽ bị đá trước khi một giờ trôi qua sau lần đăng nhập cuối cùng của mình khi lần đầu tiên tắt máy theo lịch trình.
Aaron

@Aaron đó là sự thật. Không nghĩ về điều đó. Sự kiên trì khởi động là một cảnh báo cho giải pháp này.
sdkks

5

Sau đây chạy commandvới các tham số, và nếu nó hoàn thành thành công, nó sẽ tắt hộp ngay lập tức, giả sử người dùng có thể chạy poweroff. Nó có thể cần phải sử dụng sudo poweroff.

command --parameters && poweroff

Trong khi đó, cái sau chỉ đơn giản là chạy poweroffngay lập tức khi lệnh kết thúc:

command --parameters ; poweroff

Nếu bạn nghĩ lệnh cần thời gian nghỉ ngơi sau khi hoàn thành, hãy chạy

command --parameters ; sleep 3600 ; poweroff

Nếu bạn nghĩ lệnh có thể chạy quá giờ, bạn có thể giới hạn lệnh trong một giờ:

timeout 1h command --parameters ; poweroff

timeoutlà một phần của coreutilsgói nên có lẽ bạn đã có nó.


3

Nếu bạn thực sự lo lắng về bảo mật, hãy sử dụng bộ hẹn giờ ổ cắm cơ trên nguồn điện. Chỉ cần đặt nó vào bất cứ lúc nào bạn muốn nó tắt máy. Bằng cách này, không ai có thể đăng nhập từ xa và vô hiệu hóa tắt máy. Bạn sẽ cần truy cập vật lý.


2
Hệ thống tập tin tham nhũng?
Xen2050

@ Xen2050 không phải là vấn đề trên bất kỳ hệ thống tập tin (nhật ký) hiện đại nào.
Tom

1
@Tom Bạn có một nguồn cho các ô bắt buộc sẽ không bao giờ gây ra tham nhũng hệ thống tập tin nếu có nhật ký? Âm thanh mới đối với tôi, tôi muốn đọc nó. Ít nhất thì nó cũng phải đánh dấu hệ thống tập tin là bẩn, buộc một fsck phải không?
Xen2050

1
Trong hầu hết các trường hợp, nó chỉ nên phát lại tạp chí và được thực hiện với nó. Việc tắt nguồn không được gây ra lỗi hệ thống tệp trên hệ thống tệp được ghi nhật ký, mặc dù không có gì đảm bảo trừ khi bạn sử dụng hệ thống tệp như ZFS được thiết kế riêng cho trường hợp này.
Tom

1
Phát lại nhật ký có thể thất bại - Tôi đã có một phiên fsck rất khó khăn vài tuần trước sau khi bị cắt điện second giây cho một máy không có UPS. Đó là sử dụng ext4 với một tạp chí; nó không hoàn toàn bất khả chiến bại!
Toby Speight

2

Nếu bạn đang ở trong systemdmáy, bạn có thể sử dụng bộ hẹn giờ đơn điệu

Bộ hẹn giờ /etc/systemd/system/shutdown_after_an_hour.timer

[Unit]
Description=shutdown after an hour

[Timer]
OnBootSec=1h

[Install]
WantedBy=timers.target

Bộ hẹn giờ /etc/systemd/system/shutdown_after_an_hour.service:

[Unit]
Description=shutdown after an hour

[Service]
ExecStart=/sbin/poweroff --force --no-wall
Type=oneshot

Nó được kích hoạt thông qua

# systemctl enable shutdown_after_an_hour.timer

Trạng thái của nó (đặc biệt là thời gian còn lại trước khi tắt máy) có sẵn thông qua

# systemctl list-timers shutdown_after_an_hour.timer

Nó sẽ hoạt động trong lần khởi động lại tiếp theo, nó không hữu ích cho systemctl startnó trong phiên khi nó được tạo vì nó sẽ không hoạt động (vì nó không được kích hoạt trong quá trình khởi động lại) hoặc tắt máy ngay nếu quá một giờ. Tôi không biết cái nào sẽ xảy ra như một vấn đề thực tế, tôi chưa bao giờ thử nghiệm trường hợp cụ thể đó.


1

Cố gắng đặt tập lệnh ( sudo shutdown -P 3600) trong /etc/init.dthư mục để chạy tự động khi khởi động.

Hoặc thử sử dụng anacron, thêm lệnh trong /etc/anacrontabtệp. Tôi cũng đề nghị sử dụng nohuptrước lệnh để chắc chắn rằng lệnh vẫn hoạt động sau khi đăng xuất.


1
Tùy thuộc vào distro, nó có thể không được thực thi nếu chỉ ở trong init.d
sdkks

@sdkks, bạn nói đúng. Anacron cũng có thể được xem xét. đặt tập lệnh vào / etc / anacrontab, cũng được sử dụng với 'nohup' trong trường hợp đăng xuất.
Saveriofr

1
@Saveriofr Bạn có thể chỉnh sửa câu trả lời của mình để cải thiện chất lượng của nó (tốt hơn là đăng thông tin bổ sung dưới dạng nhận xét).
Anthony G - công lý cho Monica

1

Tận dụng tệp đăng xuất của Shell của bạn

Nếu bạn chỉ cần máy chủ cho các tác vụ tương tác hoặc không tương tác được bắt đầu bởi UID của bạn, hãy xem xét đưa các lệnh tắt máy vào tệp ~ / .bash_logout của bạn . Các tay GNU Bash nói:

Khi shell đăng nhập tương tác thoát hoặc shell đăng nhập không tương tác thực thi lệnh dựng sẵn thoát, Bash đọc và thực thi các lệnh từ tệp ~ / .bash_logout, nếu nó tồn tại.

Vì vậy, việc thêm "sudo poweroff" hoặc tương tự với tệp đăng xuất của bạn sẽ tắt máy chủ ngay khi bạn đăng xuất khỏi phiên hiện tại hoặc khi phiên Bash không tương tác gọi exit. Bạn cũng có thể chọn sử dụng tại hoặc vượt qua thời gian trễ để tắt máy nếu bạn muốn trì hoãn việc tắt máy.

Để có cách tiếp cận tương tác hơn với điều này, bạn có thể đặt Bashism sau vào tệp đăng xuất của mình:

# Shutdown unless N or n is pressed within 30 seconds.
shopt -s nocasematch
read -t 30 -N 1 -p 'Shutdown now? (Y/n) '
[[ "$REPLY" =~ n ]] || sudo poweroff

Hãy cẩn thận

Có một số lưu ý bạn nên ghi nhớ về giải pháp này:

  • Điều này có thể sẽ hoạt động ngay cả dưới một thiết bị đầu cuối được khởi động bởi X Windows, nhưng có lẽ sẽ không hoạt động cho phiên X11 không được khởi chạy bởi startxhoặc tương tự.
  • Nếu bạn có các tập lệnh không tương tác gọi exit, bạn có thể gặp phải tình trạng tắt máy mà bạn không mong đợi.
  • Tệp sudoers của bạn có thể nhắc nhập mật khẩu nếu bạn chưa chỉ định NOPASSWDcho các lệnh tắt máy hoặc nếu bạn chưa gọi sudo -vtrước khi chạy lệnh tắt máy.
  • Có lẽ có những trường hợp khác tôi chưa nghĩ đến.

Nói tóm lại, bạn có thể muốn xem xét liệu phương pháp này có đáp ứng nhu cầu thực tế của bạn hay không, liệu một cách tiếp cận hoàn toàn khác như theo dõi sự vắng mặt của người dùng đã đăng nhập hoặc một số phương án khác là cách tốt hơn. Số dặm của bạn chắc chắn sẽ thay đổi.

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.