web-dev-qa-db-ja.com

アクティビティがなかった場合のサーバーの自動シャットダウン

過去1時間にアクティビティがなかった場合、午前01:00後にサーバーをシャットダウンする必要があります。 00:43に最後の接続があったとしましょう。その後、01:43に再度チェックする必要があります。

このようなスクリプトの書き方/最終ログイン時刻の取得方法は? SSH接続に基づく

1
user45656

これにより、ユーザーとアイドル時間のリストが1行に1ユーザーずつ表示されます。

w | tr -s " " | cut -d " " -f 1,5 | tail -n +3

重要:wについては、manページの「注」セクションを参照してください。上記の行は次のようなものを生成します。

username1 0.00s
username2 48.08s

次に、cronを使用して、作成したスクリプトを実行し、wからの出力を利用します。好みのスクリプト言語を使用してください。おそらく、ユーザー名を気にせず、アイドル時間だけを気にしますか?

w | tr -s " " | cut -d " " -f 5 | tail -n +3

3600秒未満の結果は、1時間のアイドル時間の要件を満たしていません。

過去1時間にアクティビティがなかった場合、午前01:00後にサーバーをシャットダウンする必要があります。 00:43に最後の接続があったとしましょう。その後、01:43に再度チェックする必要があります。

Cronジョブ自体を動的に変更する必要はありませんか? 1時間に1回実行すれば満足できると思います。そうでなければ、その精度を得るためにスクリプトを毎分実行する必要があります。

以下は、PHPのスクリプトです。これはLinux Mint 13で正常に動作します。Ubuntuやその他のLinuxでも問題ありません。

#!/usr/bin/env php
<?php
/* Shutdown Script
 *
 * If idle times exceed a defined value or if no users are logged in,
 * shutdown the computer. If running from cron there should be no "dot"
 * in the script file name. Make the script executable.
 *
 * Caveat: running the script as root in an interactive Shell will cause
 * immediate shutdown, as though typing 'shutdown -P now'.
 * (It should only be run from cron.)
 */
$max_idle_time = 3600; // seconds
$cmd_idle_time = 'w|tr -s " "|cut -d " " -f 5|tail -n +3'; // idle times
$shutdown_now = true; // boolean

function shutdown() {
    exec('/sbin/shutdown -P now'); // or -h
}

// Form an array from the output of $cmd_idle_time
$idle_times = explode("\n", Shell_exec($cmd_idle_time));

foreach ($idle_times as $idle_time) {
    // Are there no users logged on, or did root run this from a shell?
    if (empty($idle_time)) {
        continue;
    }

    // Remove trailing "s" from idle time and round to nearest second
    $idle_time = round(substr($idle_time, 0 , -2));

    // Cancel shutdown if any user's idle time is less than $max_idle_time
    if ($idle_time < $max_idle_time) {
        $shutdown_now = false;
    }
}

// If the $shutdown_now boolean is still true, shutdown.
if ($shutdown_now === true) {
    shutdown();
}
?>
2
user8290

さて、Linuxサーバーは、あなたが述べたシャットダウンの要件をほとんど要求しません。 Linuxは常に自己に接続しています。それは言った、おそらく何かをリグできます。

/ var/log/messagesは新しいssh接続を表示します。

ps aux | grep sshはアクティブなsshプロセスを表示します

一緒に、ある種のスクリプトを記述して、/ var/log/messagesで過去1時間の接続をチェックし、アクティブな接続がないことを確認してからシャットダウンすることができます。

この記事 IBMが役立つかもしれません。

1
coteyr