60分間実行した後にLinuxサーバーをシャットダウンするにはどうすればよいですか?


18

セキュリティ上の理由で通常はオフになっているサーバーがあります。作業したいときは、スイッチを入れてタスクを実行し、再びシャットダウンします。私のタスクは通常15分以内で完了します。60分後に自動的にシャットダウンするメカニズムを実装したいと思います。

cronでこれを行う方法を調査しましたが、サーバーが最後にオンになったときにcronが考慮されないため、適切な方法だとは思いません。定期的なパターンのみ設定できますが、そのデータは考慮されません。

どうすればこの実装を行うことができますか?


4
見ていat(一回の実行を)。
dirkt

14
私はこれを行っていませんがsudo shutdown -h +60、シャットダウン(-halt)プロセスのために60分のカウントダウンカウンターを開始するログインスクリプトを開始できます。キャンセルしたい場合は、できますsudo shutdown -c (ただし、これはcronを使用しません)
-guiverc

7
タスクの性質によっては、Dockerコンテナ内で実行する価値があるかもしれないので、サーバーのスイッチを切ることを心配する必要はありません。コンテナが作成され、タスクが実行され、その後破棄されます。
ビセンテオリバートリエラ

6
これによる本当のセキュリティ上の利益を期待しないでください。ほとんどの脆弱性は1秒未満で悪用される可能性があるため、1時間後に電源をオフにしても悪用を防ぐことはできません。そして、脆弱性を発見した攻撃者は、攻撃を実行するためにマシンの電源を入れるのを待つことができます。
カスペルド

2
Re:@kasperdのコメント、実際にオンラインであるかどうかに関係なく、サーバー上でまったく同じ量のセキュリティが必要であると言い直します。サーバーであるため、何かに接続されているため、電源がオンになると何かがわかります-自動スイープはあなたが心配するものではなく、あらゆる種類の接続であり、あなたはそれを常に回避することはできません唯一の方法。
StephenG

回答:


23

毎回同じユーザーとしてタスクを実行する場合、オプションでオプション-Pを付けてシャットダウンコマンドをプロファイルに追加するだけです。数字は、シャットダウンコマンドが遅延する分数を表します。ユーザーがパスワードなしでsudoを介してシャットダウンコマンドを実行できることを確認してください。

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

11
時間は秒単位ではなく分単位です。Try shutdown -k -P 3600vs shutdown -k -P 60-kウォールメッセージを出力しますが、他の効果はありません)
18年

12
ただし、最初にコマンドを1回試してみてください。インスタントシャットダウンがプロファイルにバインドされることは望ましくありません。
ファビアンレーリング

17
すべてのsshログインが新しいシャットダウンの呼び出しを引き起こすと思います。カウンターはリセットされますか?
JoL

4
また、シャットダウンのマンページに記載されているように、最後の5分間はログインが許可されないことに言及する価値があるかもしれません。
-JoL

6
ログイン後60分は、ブート後60分と同じではないことに注意してください。マシンを起動してからログインを忘れた場合はどうなりますか?
ハーゲンフォンアイゼン

69

いくつかのオプションがあります。

  • 時間を直接提供してshutdown -Pください:

    shutdown -P +60
    

    shutdown マニュアルページも指摘していることに注意してください

    時間引数を使用する場合、システムが停止する5分前に/ run / nologinファイルが作成され、それ以上のログインが許可されないようにします。

  • atコマンドを使用します。

  • 起動時に実行されるsystemdユニットファイルまたはinitスクリプトを作成しますshutdown -P 60

  • cronを使用して@reboot、起動後にコマンドを実行します。

    (ルート)crontabに追加:

    @reboot shutdown -P +60
    

最後の2つの方法では、sleep 3600 && shutdown -P nowtime引数を使用する代わりにshutdown、シャットダウンを60分間遅らせることもできます。これにより、シャットダウンが発行される直前までログインできます。


2
私はsleepコマンドで、あなたはまだ時間を指定する必要があると思いますshutdown- nowすでに待機を行っている場合はその引数に使用したいと思いますあなたの下から消えます!)。
トビー・スペイト

1
が、shutdown -P 60作品には、コマンドが呼び出されるべきかの方法ではありません。manページによると、を使用する必要がありますshutdown -P +60。---また、時間引数なしのシャットダウン(例ではsleep 3600 && shutdown -P)は1分遅れます(などshutdown -P +1)。Toby Speightが書いたように、おそらくあなたは使いたいでしょうshutdown -P now
パブーク

34

これはXY問題のように見えます

私のタスクは通常15分以内で完了します。60分後に自動的にシャットダウンするメカニズムを実装したいと思います。

60分後にシャットダウンすると、特に複雑な問題が発生する可能性があり、さらに時間が必要になる可能性があります。これまでのソリューションの多くは、シャットダウンを遅らせることを容易にしませんでした。

タスクがインタラクティブなタスクではなく、別のマシンから自動的にトリガーされるスクリプト化されたタスクである場合、@ sdkksはそのための優れたソリューション提供しました。スクリプトとそのすべてのタスクが終了したらすぐにマシンにタスクを実行して電源オフを実行する必要があります。

ただし、タスクが対話型タスクの場合は、代わりにアイドル状態の検出を行うことをお勧めします。

GUI(X11)でタスクを実行する場合、ここで説明するアプローチを使用してアイドルGUIセッションを検出できます。システムがアイドル状態で、再びアクティブになったときにコマンドを実行します

ターミナルを介してタスクを実行する場合、whoコマンドを使用してログインしているユーザーを検出できます。who空の結果が返された場合にマシンをシャットダウンするcronjobをセットアップできます。これはかなり保守的なアプローチになることに注意してください。コンソールを接続したままにすると、システムはシャットダウンしませんが、アイドル状態になります。

もう少し積極的になり、アイドル状態のターミナルセッションを切断する場合は、以前のアプローチとアイドル状態のSSHセッション ClientAliveIntervalおよびを自動的に切断する方法を組み合わせることができますClientAliveCountMax。SSHを使用していないがローカルターミナルセッションを使用している場合の別のアプローチは、コマンドによって返されるターミナルアイドル時間を使用することwです。


2
これは非常に重要なポイントです。実装するものは何でも- シャットダウンをキャンセルできることを確認することはあなたの関心事です。
シャドウ

1
まだ60mで動作している場合、何かがおかしいので、もう一度やり直してください。これはクラウド的に非常に高価になる可能性があります。ある時点でシャットダウンを保証しなかったため、4,000ドルを超える額に戻りました。
mckenzm

8

ここでの以前の回答はすべて完璧な要件を満たしていますが、タスクが完了するとすぐにマシンの電源をオフにすることもできます。

bashスクリプトをtrap実行できます。つまり、特定の信号を傍受し、必要なときに特定のタスクを実行できます。EXITトラップできる信号の1つです。

次のことができるようになります。

  1. 設定するtrapためにEXITあなたの自動化されたタスクの終了を意味し、あなたの自動化されたシェルスクリプトの
  2. にを設定trapします.bashrc EXIT。つまり、そのマシンからログアウトするたびに電源をオフにします。

タスクがアドホック検査と手動判断を必要としない限り、オプション#1は理想的なケースです。

オプション#2は、電源をオフにせずに端末を終了するのを忘れた場合に対応します。ただし、注意点があります。同じマシンに対して複数の端末を開いており、そのうちの1つを終了しても、マシンの電源はすべて同じままになります。(それを回避するためにスクリプト化できますが、私は解決策を複雑にしません。)

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

これは.bashrc、オプション#1のスクリプトの最上部のどこかで、オプション#2の最後に配置できます。

poweroffスクリプトの最後で使用しないのはなぜですか?

set -eo pipefailはスクリプトの一番上で使用することを好みます。エラーが発生した場合、黙って失敗することはありません。それ以上のコマンドの実行を停止します。trapof EXITsignalは、エラーが原因でスクリプトが途中で終了する場合をカバーする必要があります。

ただし、タスクの場合、これはマシンが完了する前にシャットダウンすることも意味します。

bashスクリプトをデバッグしやすくするために使用する単純なテンプレートがあります。多分それはいくつかの役に立つかもしれません。この要点をご覧ください。


同意し、おそらくcronから時刻をシャットダウンすることを確認します。これは死んだ人のブレーキです。
-mckenzm

@Abigail for script、それは上にある必要があります。なぜなら、.bashrc何か他のものがそれを上書きする場合に備えて、下を好むからです。あなたの懸念は明らかではないようですが、おそらくrepl.itのサンプルスニペットを共有できますか?
sdkks

@mckenzmわかりません。サンプルコードやその他の説明を共有できますか?
sdkks

5

@dirktコメントについて詳しく説明すると、シェルがログイン時に使用するファイルまたは任意のファイルにatコマンドを挿入して、ログインの60分後に自動シャットダウンをスケジュールできます。.bashrc.profile

何かのようなもの:

at now + 60 minutes -f /sbin/halt

このタスクはまさにat「路地」です。また、atタスクを表示できます/var/spool/
sdkks

5
at再起動後も存続するため、このコンテキストでの使用はお勧めしません。OPがログインし、手動でシャットダウンしてから1時間以内に再度ログインすると、最初にスケジュールされたシャットダウンプロシージャの最後のログインから1時間経過する前にキックオフされます。
アーロン

@Aaronそれは本当です。それを考えていない。ブートの永続性は、このソリューションの注意事項です。
sdkks

5

以下はcommandパラメーターを指定して実行され、正常に完了すると、ユーザーがを実行できると仮定して、すぐにボックスがオフになりますpoweroff。を使用する必要がありますsudo poweroff

command --parameters && poweroff

一方、次poweroffのコマンドは、コマンドが終了するとすぐに実行されます。

command --parameters ; poweroff

完了後にコマンドに休憩時間が必要と思われる場合は、実行します

command --parameters ; sleep 3600 ; poweroff

コマンドが時間外に実行されると思われる場合は、1時間に制限できます。

timeout 1h command --parameters ; poweroff

timeoutcoreutilsパッケージの一部であるため、おそらく既に持っています。


3

セキュリティが本当に心配な場合は、電源の機械式コンセントタイマーを使用してください。シャットダウンする時間に設定するだけです。この方法では、誰もリモートでログインしてシャットダウンを無効にすることはできません。物理的なアクセスが必要です。


2
ファイルシステムの破損?
Xen2050

@ Xen2050は、現代の(ジャーナリング)ファイルシステムでは問題ありません。
トム

1
@Tomジャーナリングがある場合、ファイルシステムの破損を引き起こすことのない強制マウント解除のソースはありますか?私には新しいように聞こえます、私はそれを読みたいです。少なくとも、ファイルシステムをダーティとしてマークし、fsckを強制する必要がありますか?
Xen2050

1
ほとんどの場合、ジャーナルをリプレイし、それで完了する必要があります。パワーダウンは、ジャーナリングされたファイルシステムでファイルシステムの破損を引き起こすべきではありませんが、この場合のために特別に設計されたZFSなどのファイルシステムを使用しない限り、保証はありません。
トム

1
ジャーナルの再生が失敗する可能性があります-UPSのないマシンの½秒の電源切断の後、数週間前に非常に難しいfsckセッションがありました。それは、ext4とジャーナルを使用していました。完全に無敵ではありません!
トビー・スペイト

2

あなたがしている場合systemd、マシンは、使用することができます単調なタイマーを

タイマーユニット /etc/systemd/system/shutdown_after_an_hour.timer

[Unit]
Description=shutdown after an hour

[Timer]
OnBootSec=1h

[Install]
WantedBy=timers.target

タイマーユニット/etc/systemd/system/shutdown_after_an_hour.service

[Unit]
Description=shutdown after an hour

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

経由で有効になります

# systemctl enable shutdown_after_an_hour.timer

そのステータス(特にシャットダウンまでの残り時間)は、

# systemctl list-timers shutdown_after_an_hour.timer

次回の再起動systemctl start時に機能しますが、セッション中に作成されると動作しません(再起動中にトリガーされなかったため)、または1時間を過ぎた場合はすぐにマシンをシャットダウンするため、セッション中は役に立ちません。どちらが実際に起こるかわかりませんが、その特定のケースをテストしたことはありません。


1

スクリプト(sudo shutdown -P 3600)を/etc/init.dディレクトリに置いて、起動時に自動的に実行するようにしてください。

またはanacron、を使用して、/etc/anacrontabファイルにコマンドを追加してみてください。またnohup、コマンドの前で使用して、ログアウト後もコマンドがまだ機能していることを確認することをお勧めします。


1
ディストリビューションによっては、init.dにいるだけでは実行されない場合があります
-sdkks

@sdkks、あなたは正しい。アナクロンも考慮することができます。スクリプトを/ etc / anacrontabに配置します。これは、ログアウトのイベントで「nohup」とともに使用されます。
-Saveriofr

1
@Saveriofr 回答を編集して、品質を向上させることができます(追加情報をコメントとして投稿するよりも優れています)。
アンソニーG-モニカの正義

1

シェルのログアウトファイルを活用する

UIDによって開始される対話型タスクまたは非対話型タスクにのみサーバーが必要な場合は、シャットダウンコマンドを〜/ .bash_logoutファイルに入れることを検討してください。GNU bashのマニュアルは言います:

対話型ログインシェルが終了するか、非対話型ログインシェルがexit組み込みコマンドを実行すると、Bashは〜/ .bash_logoutが存在する場合、ファイルからコマンドを読み取って実行します。

そのため、ログアウトファイルに「sudo poweroff」などを追加すると、現在のセッションからログアウトするすぐに、または非対話型のBashセッションが呼び出されたときにサーバーの電源がオフになりますexitシャットダウンを延期したい場合は、シャットダウンを使用するか、遅延を渡すことを選択することもできます。

これに対するよりインタラクティブなアプローチのために、次のBashismをログアウトファイルに入れることができます。

# 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

注意事項

このソリューションについて留意すべきいくつかの注意事項があります。

  • これはおそらくX Windowsによって起動された端末の下でも動作しますが、おそらく、起動されていないX11セッションstartxまたは同様のX11セッションでは動作しません。
  • を呼び出す非対話型のスクリプトがあるexit場合、予期しないシャットダウンが発生する可能性があります。
  • sudoersファイルはNOPASSWD、シャットダウンコマンドを指定していない場合、またはシャットダウンコマンドをsudo -v実行する前に呼び出していない場合、パスワードを要求する場合があります。
  • おそらく私がまだ考えていない他のエッジケースがあります。

要するに、このアプローチが実際のニーズを満たしているかどうか、またはログインしているユーザーの不在やその他の代替手段の監視など、まったく異なるアプローチがより良い方法であるかどうかを検討することができます。あなたの走行距離は間違いなく異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.