Bir Linux sunucusunu 60 dakika çalıştırdıktan sonra nasıl kapatabilirim?


18

Güvenlik nedeniyle normalde kapalı olan bir sunucum var. Üzerinde çalışmak istediğimde çalıştırıyorum, görevlerimi yerine getiriyorum ve tekrar kapatıyorum. Görevlerim genellikle 15 dakikadan fazla sürmez. 60 dakika sonra otomatik olarak kapatmak için bir mekanizma uygulamak istiyorum.

Bunu cron ile nasıl yapacağımı araştırdım, ama bunun doğru yol olduğunu düşünmüyorum çünkü cron sunucu son açıldığında dikkate almıyor. Yalnızca periyodik kalıplar ayarlayabilirim, ancak bu verileri dikkate almazlar.

Bu uygulamayı nasıl yapabilirim?


4
Bir göz atın at(bir defalık yürütme).
dirkt

14
Bunu yapmadım, ancak oturum açma komut dosyanız sudo shutdown -h +60, kapatma (-halt) işlemi için 60 dakikalık bir geri sayım sayacı başlatabilir. İptal etmek isterseniz, bunu yapabilirsiniz sudo shutdown -c (bu cron kullanmaz)
guiverc

7
Görevlerinizin doğasına bağlı olarak, bunları bir docker kapsayıcısında çalıştırmaya değer olabilir, bu nedenle bir sunucuyu kapatma konusunda endişelenmenize gerek yoktur. Kap oluşturulur, görevlerinizi yürütür ve bundan sonra yok edilir.
Vicente Olivert Riera

6
Bundan gerçek bir güvenlik faydası beklemeyin. Çoğu güvenlik açığından bir saniyeden daha kısa sürede yararlanılabilir, bu nedenle bir saat sonra kapanmak sömürüyü engellemez. Bir güvenlik açığı bulan bir saldırgan, saldırıyı gerçekleştirmek için makineyi açmanızı bekleyebilir.
kasperd

2
Re: @kasperd yorum, ben aslında ne kadar az ya da çok çevrimiçi ne olursa olsun sunucunuzda tam olarak aynı miktarda güvenlik gerektiğini söyleyerek yeniden ifade ediyorum. Not, bir sunucuya bağlı, bu yüzden bir şeye bağlı ve bu da bir şeyin açıldığında bileceği anlamına geliyor - otomatik süpürmeler endişe duyduğunuz şey değil, her türlü bağlantı ve her zaman maksimum güvenlikten kaçınamıyorsunuz tek yol.
StephenG

Yanıtlar:


23

Görevlerinizi her seferinde aynı kullanıcıyla yürütürseniz, profilinize isteğe bağlı olarak -P seçeneği ile kapatma komutunu ekleyebilirsiniz. Sayı, kapatma komutunun ertelendiği dakika anlamına gelir. Kullanıcının parola olmadan sudo üzerinden shutdown komutunu yürütebildiğinden emin olun.

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

11
Zaman saniye değil dakika cinsindendir. Deneyin shutdown -k -P 3600vs shutdown -k -P 60( -kbaskılar duvar mesajında ancak diğer etkisi yoktur)
sebasth

12
Ama önce komutu bir kez deneyin, profilinize anında kapatma yapılmasını istemezsiniz!
Fabian Röling

17
Her ssh girişinin yeni bir kapatma çağrısına neden olacağını hayal ediyorum. Sayaç o zaman sıfırlanır mı?
JoL

4
Kapatma kılavuzunda belirtildiği gibi, son 5 dakika içinde girişlere izin verilmeyeceğinden bahsetmek de faydalı olabilir.
JoL

6
Giriş yaptıktan 60 dakika sonra önyüklemeden sonraki 60 dakika ile aynı değildir. Makineyi önyükleyip giriş yapmayı unutursanız ne olur?
Hagen von Eitzen

69

Birkaç seçenek var.

  • Doğrudan aşağıdakilere zaman sağlayın shutdown -P:

    shutdown -P +60
    

    shutdown Kılavuz sayfasının ayrıca şunu da not ettiğini unutmayın :

    Zaman bağımsız değişkeni kullanılırsa, sistem kapanmadan 5 dakika önce / run / nologin dosyası oluşturulur ve daha fazla oturum açmaya izin verilmez.

  • atKomutu kullan .

  • Başlangıçta çalışan bir systemd birim dosyası veya init betiği oluşturun shutdown -P 60.

  • @rebootÖnyüklemeden sonra komutu çalıştırmak için cron'ları kullanın .

    (Root) crontab'a ekle:

    @reboot shutdown -P +60
    

Son iki yöntemde, kapatmayı 60 dakika geciktirmek için sleep 3600 && shutdown -P nowzaman bağımsız değişkenini kullanmak yerine de kullanabilirsiniz shutdown. Bu şekilde oturum kapatma işlemi kapatılmadan önceki son ana kadar mümkündür.


2
Komutla düşünüyorum sleep, yine de bir zaman belirtmeniz gerekiyor shutdown- nowbeklemeyi zaten yapsaydık bu argüman için kullanmak isteriz (ancak işinizi daha önce kaydetmek için çok fazla uyarı almayacağınızı unutmayın) altından kaybolur!).
Toby Speight

1
shutdown -P 60Çalışmasına rağmen komutun nasıl çalıştırılması gerektiği değildir. Man sayfasına göre kullanmalısınız shutdown -P +60. --- Ayrıca bir zaman argümanı olmadan kapatma (örnekte sleep 3600 && shutdown -P) bir dakika geciktirilecektir (gibi shutdown -P +1). Toby Speight'ın yazdığı gibi, muhtemelen kullanmak isteyeceksiniz shutdown -P now.
pabouk

33

Bu bir XY problemine benziyor .

Görevlerim genellikle 15 dakikadan fazla sürmez. 60 dakika sonra otomatik olarak kapatmak için bir mekanizma uygulamak istiyorum.

60 dakika sonra kapanırsanız, özellikle karmaşık bir sorunla karşılaşma riskiniz vardır ve daha fazla zamana ihtiyacınız vardır. Önceki çözümlerin birçoğu kapanmayı geciktirmeyi kolaylaştırmaz.

Görev etkileşimli bir görev değilse, bunun yerine başka bir makineden otomatik olarak tetiklenen bir komut dosyasıysa, @sdkks bunun için harika bir çözüm verdi ; gerçekten komut dosyası ve tüm görevleri biter bitmez makineyi poweroff çalıştırmak için görev yapmalısınız.

Ancak, göreviniz etkileşimli bir görevse, bunun yerine boşta algılama yapmanızı öneririm.

Görevinizi bir GUI'de (X11) yaparsanız, burada açıklanan yaklaşımı kullanarak boş GUI oturumlarını algılayabilirsiniz: Sistem boştayken ve tekrar etkin olduğunda bir komut çalıştırın

Görevi bir terminal aracılığıyla yaparsanız, şu whokomutu kullanarak oturum açmış kullanıcıları algılayabilirsiniz . whoBoş bir sonuç döndürürse makineyi kapatan bir cronjob ayarlayabilirsiniz . Bunun oldukça muhafazakar bir yaklaşım olacağını unutmayın; konsolu bağlı bırakırsanız sistemi kapatmaz, ancak boşta kalır.

Biraz daha agresif olmak ve boş terminal oturumlarını da kesmek istiyorsanız, önceki yaklaşımı boş SSH oturumlarını ClientAliveInterval ve otomatik olarak bağlantıyı keserek birleştirebilirsiniz ClientAliveCountMax. SSH'niz yoksa, ancak yerel bir terminal oturumunuz varsa, bunun için başka bir yaklaşım , komut tarafından döndürülen terminal boşta kalma süresini kullanmaktır w.


2
Bu çok önemli bir konu. Ne yaparsanız yapın - kapatmayı da iptal edebileceğinizden emin olmak sizin yararınıza olacaktır .
Gölge

1
Hala 60 m'de çalışıyorsa bir şeyler ters gitti, bu yüzden belki tekrar başlayın. Bu bulut açısından çok pahalı olabilir. Bir seferde kapanmayı garanti etmemek beni 4.000 doların üzerine getirdi.
mckenzm

8

Buradaki önceki yanıtların hepsi mükemmelliği gerektirse de, görevler yapılır yapılmaz makinenizi de kapatabilirsiniz.

bashkomut dosyaları trapped olabilir , yani bazı sinyaller yakalanabilir ve gerektiğinde bazı görevler yürütülebilir. EXITsıkışabilecek sinyallerden biridir.

Şunları yapabilirsiniz:

  1. Otomatik kabuk komut dosyalarınız trapiçin bir set EXIT, yani otomatik görevlerinizin sonlandırılması
  2. Bir ayarlama trapşunlara ait .bashrc EXITsen Gücü, makinenin kapalı oturumu zaman, yani.

Görevleriniz geçici inceleme ve manuel yargılama gerektirmiyorsa, 1. seçenek ideal bir durum olacaktır.

Seçenek # 2, kapatmadan terminalden çıkmayı unutacağınız durumları kapsar. Yine de bir uyarı var; aynı makineye açık birden fazla terminaliniz varsa ve bunlardan birinden çıkarsanız, yine de makineyi tamamen kapatır. (Bundan kaçınmak için senaryo yazılabilir, ancak çözümü zorlaştırmayacağım.)

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

Bu, .bashrc# 2 seçeneğinin sonunda, betiğinizin üstünde # 1 seçeneği için bir yerde olabilir.

Neden poweroffbetiğin sonunda kullanılmıyor ?

set -eo pipefailSenaryolarımın üstünde kullanmayı tercih ederim . Herhangi bir hata olursa, sessizce başarısız olmaz; daha fazla komut çalıştırmayı durduracaktır. trapbir EXITsinyal komut hatalar nedeniyle zamanından önce sona erer durumları kapsamalıdır.

Ancak görevleriniz için bu, makinenin tamamlanmadan önce kapanacağı anlamına da gelebilir.

Ben bashkomut dosyası hata ayıklama kolaylaştırmak için kullandığım basit bir şablon var ; belki bazı yararları olabilir. Lütfen bu özete bakın .


Kabul etti ve emin olmak için belki günün cronundan kapanma zamanı. Bu ölü bir adamın freni.
mckenzm

@Abigail için senaryo, yukarıda olmalı, çünkü .bashrcbaşka bir şeyin üzerine yazması durumunda altını tercih ederim. Endişeniz net görünmüyor, belki repl.it'te örnek bir pasaj paylaşabilir misiniz?
sdkks

@mckenzm Anlamıyorum. Örnek kod veya daha fazla açıklama paylaşabilir misiniz?
sdkks

5

@Dirkt yorumum tertipleyerek, bir ekleyebilirsiniz atüzerinde komutu sizin .bashrcveya .profileveya giriş üzerinde kabuk kullandığı 60 dakika için giriş yaptıktan sonra otomatik kapanma zamanlama hangisi dosyası.

Gibi bir şey:

at now + 60 minutes -f /sbin/halt

Bu görev tam yukarıya doğru at. Ayrıca şu atgörevleri de görebilirsiniz/var/spool/
sdkks

5
atBu bağlamda kullanmaya karşı tavsiyede bulunuyorum çünkü yeniden başlatılıyor. OP oturum açacaksa, manuel olarak kapatıp bir saat içinde tekrar oturum açacak olsaydı, ilk girişten sonra ilk planlanan kapanma işlemi başladığında bir saat geçmeden başlayacaktı.
Aaron

@Aaron bu doğru. Bunu düşünmedim. Önyükleme kalıcılığı bu çözüm için bir uyarıdır.
sdkks

5

Aşağıdakiler commandparametrelerle çalışır ve başarıyla tamamlanırsa, kullanıcının çalışabileceği varsayılarak kutuyu derhal kapatır poweroff. Kullanması gerekebilir sudo poweroff.

command --parameters && poweroff

poweroffKomut sona erdiğinde aşağıdakiler hemen çalışır :

command --parameters ; poweroff

Komutun tamamlandıktan sonra dinlenme zamanı gerektiğini düşünüyorsanız, çalıştırın

command --parameters ; sleep 3600 ; poweroff

Komutun fazla mesaiyi çalıştırabileceğini düşünüyorsanız, bir saatle sınırlandırabilirsiniz:

timeout 1h command --parameters ; poweroff

timeoutcoreutilspaketin bir parçası olduğu için muhtemelen zaten var.


3

Güvenlik konusunda gerçekten endişeleriniz varsa, güç kaynağında mekanik bir çıkış zamanlayıcısı kullanın. Sadece kapanmasını istediğiniz zamana ayarlayın. Bu şekilde kimse uzaktan oturum açamaz ve kapanmayı devre dışı bırakamaz. Fiziksel erişime ihtiyacınız olacak.


2
Dosya sistemi bozulması?
Xen2050

@ Xen2050 herhangi bir modern (günlük kaydı) dosya sisteminde sorun değil.
Tom

1
@Tom Eğer günlük kaydı varsa, zorunlu sayıların kaynağınız hiçbir zaman dosya sisteminde bozulmaya neden olmaz mı? Kulağa yeni geliyor, okumak istiyorum. En azından dosya sistemini kirli olarak işaretlemeli, fsck'i zorlamalı değil mi?
Xen2050

1
Çoğu durumda, sadece dergiyi tekrar oynatmalı ve onunla yapılmalıdır. Kapatma, günlüklü bir dosya sisteminde dosya sistemi bozulmasına neden olmamalıdır, ancak bu durum için özel olarak tasarlanmış ZFS gibi bir dosya sistemi kullanmadığınız sürece hiçbir garanti verilmez.
Tom

1
Günlük tekrarlama başarısız olabilir - UPS olmayan bir makineye power saniyelik bir elektrik kesintisinden sonra birkaç hafta önce çok zor bir fsck oturumu gerçekleştirdim. Bu bir günlükle ext4 kullanıyordu; tamamen yenilmez değil!
Toby Speight

2

Bir systemdmakinedeyseniz, monoton bir zamanlayıcı kullanabilirsiniz

Zamanlayıcı ünitesi /etc/systemd/system/shutdown_after_an_hour.timer

[Unit]
Description=shutdown after an hour

[Timer]
OnBootSec=1h

[Install]
WantedBy=timers.target

Zamanlayıcı ünitesi /etc/systemd/system/shutdown_after_an_hour.service:

[Unit]
Description=shutdown after an hour

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

Üzerinden etkinleştirilir

# systemctl enable shutdown_after_an_hour.timer

Durumu (özellikle kapanmadan önce ne kadar zaman kaldı)

# systemctl list-timers shutdown_after_an_hour.timer

Bir sonraki yeniden başlatma üzerinde çalışacak, systemctl startçalışma sırasında (yeniden başlatma sırasında tetiklenmediği için) oluşturulmadığı için oturum sırasında işe yaramaz veya bir saat geçerse makineyi hemen kapatır. Aslında hangisinin olacağını bilmiyorum, bu özel durumu hiç test etmedim.


1

Komut dosyasını ( sudo shutdown -P 3600) /etc/init.dbaşlangıçta otomatik olarak çalıştırmak için dizine koymaya çalışın .

Veya anacronkomutu kullanarak /etc/anacrontabdosyaya eklemeyi deneyin . Ayrıca, nohupoturumdan sonra komutun hala çalıştığından emin olmak için komutun önünde kullanılmasını öneririm .



@sdkks, haklısın. Anacron da düşünülebilir. betiği / etc / anacrontab içine koyarken çıkış durumunda 'nohup' ile de kullanılır.
Saveriofr

1
@Saveriofr Kalitenizi artırmak için cevabınızı düzenleyebilirsiniz (ek bilgi yorum yapmaktan daha iyi).
Anthony G - Monica için adalet

1

Shell'in Oturum Kapatma Dosyasından Yararlanın

Sunucuya yalnızca UID'niz tarafından başlatılan etkileşimli veya etkileşimli olmayan görevler için ihtiyacınız varsa, kapatma komutlarınızı ~ / .bash_logout dosyanıza koymayı düşünün . GNU Bash Kılavuzu diyor ki:

Etkileşimli bir giriş kabuğu çıktığında veya etkileşimli olmayan bir giriş kabuğu çıkış yerleşik komutunu yürüttüğünde, Bash varsa ~ / .bash_logout dosyasından komutları okur ve yürütür.

Yani, oturum kapatma dosyasına "sudo poweroff" veya benzeri ekleyerek sunucuyu kapatmak istiyorum Oturumu en kısa sürede geçerli oturumda, veya bir interaktif olmayan Bash oturumu çağrılar arasında exit. Ayrıca kullanmayı tercih olabilir de ya bir zaman gecikmesi geçmesi kapatma , kapatma erteleme tercih ediyorsanız.

Buna daha etkileşimli bir yaklaşım için, aşağıdaki Bashizmleri oturum kapatma dosyanıza koyabilirsiniz:

# 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

Uyarılar

Bu çözüm hakkında aklınızda bulundurmanız gereken bazı uyarılar var:

  • Bu muhtemelen X Windows tarafından başlatılan bir terminal altında bile çalışacaktır, ancak muhtemelen başlatılmayan startxveya benzeri bir X11 oturumu için işe yaramayacaktır .
  • Çağıran etkileşimli olmayan komut dosyalarınız exitvarsa, beklemediğiniz kapanmalar yaşayabilirsiniz.
  • NOPASSWDKapatma komutları için belirtmediyseniz veya sudo -vkapatma komutunuzu çalıştırmadan önce aramadıysanız, sudoers dosyanız bir parola isteyebilir .
  • Muhtemelen henüz düşünmediğim başka durumlar da var.

Kısacası, bu yaklaşımın gerçek ihtiyacınızı karşılayıp karşılamadığını ya da giriş yapmış kullanıcıların bulunmaması ya da başka bir alternatifin izlenmesi gibi tamamen farklı bir yaklaşımın daha iyi bir bahis olup olmadığını değerlendirmek isteyebilirsiniz. Kilometreniz kesinlikle değişecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.