10

Javaを使用してコンピューターを強制的にシャットダウンする方法を知っています。たとえば、次のコードは強制シャットダウンで正常に機能します。

public static void main(String arg[]) throws IOException{
    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec("shutdown -s -t 0");
    System.exit(0);
}

ここで、特定の時間にコンピューター(シャットダウン状態)を強制的に起動したい場合、Javaまたは他の言語で実行することは可能ですか?

4

4 に答える 4

15

起動をトリガーするために何かが必要です。これをトリガーする最良の方法は、WakeOnLanです。

これをJavaで実行したい場合は、これは優れたリソースになる可能性があります。

于 2013-03-26T09:26:57.797 に答える
4

wake on lanに加えて、マザーボードに接続されているサーバーグレードのハードウェアで実行され、電源を制御したり、ネットワーク接続を介してシリアルコンソール出力を提供したりできるIPMIデバイスがあります。このコンピューターは常に稼働していますが、独自のコードをロードできるものについてはよくわかりません。

このデバイスをリモートで制御して、javaを含む任意の言語からオフになっているサーバーの電源を制御できます。

http://en.wikipedia.org/wiki/Intelligent_Platform_Management_Interface

于 2013-05-04T06:19:33.147 に答える
3

BIOSがAdvancedPowerManagement(APM)バージョン1.2以降をサポートしている場合は、タイマーに基づいてスリープ/スタンディまたは休止状態からBIOSを復帰させることができるはずです。Windowsでは、エンドユーザーはタスクスケジューラを介してこれを実行できます。プログラムで実行する場合は、タスクスケジューラのインターフェイスを使用できます。

Javaを介してこれを行う方法はわかりませんが、2分後にコンピューターをウェイクアップするタスクを作成するCコードの例を次に示します。

#include <mstask.h>
#include <time.h>

int main() {
  HRESULT hr = CoInitialize(NULL);
  if (SUCCEEDED(hr)) {
    ITaskScheduler *scheduler;
    hr = CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, (void**)&scheduler);
    if (SUCCEEDED(hr)) {
      ITask *task;
      hr = scheduler->NewWorkItem(L"Wake Timer", CLSID_CTask, IID_ITask, (LPUNKNOWN*)&task);
      if (SUCCEEDED(hr)) {
        WORD index;
        ITaskTrigger *trigger;
        hr = task->CreateTrigger(&index, &trigger);
        if (SUCCEEDED(hr)) {
          time_t t = time(NULL) + 120;
          struct tm *ltime = localtime(&t);

          TASK_TRIGGER triggertime;
          memset(&triggertime, 0, sizeof(triggertime));
          triggertime.cbTriggerSize = sizeof(TASK_TRIGGER);
          triggertime.wBeginYear = ltime->tm_year+1900;
          triggertime.wBeginMonth = ltime->tm_mon+1;
          triggertime.wBeginDay = ltime->tm_mday;
          triggertime.wStartHour = ltime->tm_hour;
          triggertime.wStartMinute = ltime->tm_min;
          triggertime.TriggerType = TASK_TIME_TRIGGER_ONCE;
          trigger->SetTrigger(&triggertime);
          trigger->Release();
        }

        task->SetFlags(TASK_FLAG_DELETE_WHEN_DONE|TASK_FLAG_SYSTEM_REQUIRED|TASK_FLAG_RUN_ONLY_IF_LOGGED_ON);
        task->SetAccountInformation(L"", NULL);

        IPersistFile *file;
        hr = task->QueryInterface(IID_IPersistFile, (void**)&file);
        if (SUCCEEDED(hr)) {
          file->Save(NULL, TRUE);
          file->Release();
        }
        task->Release();
      }
      scheduler->Release();
    }
    CoUninitialize();
  }
  return 0;
}

おそらく、Windowsでこれを実行できる場合は、他のオペレーティングシステム用の同等のAPIが必要です。

于 2013-05-05T04:08:08.290 に答える
1

私はなんとかインターネット上に浮かんでいる同様の質問を見つけることができたので、あなたがそれが役立つかどうか見るためにここにリンクを投稿します。(これは私が見つけたスレッドでした:http://www.coderanch.com/t/440680/gc/interact-Windows-Task-Scheduler-Java

まず最初に、Javaは仮想マシンで実行する必要のある言語であると付け加えるかもしれません。これを回避する方法は2つありません。私は、BIOSレベルに近いプログラミングなど、「低レベル」プログラミングに精通していません。これは、私たちがこれに向かっているようなものです。

質問は明らかにJavaに関するものだったので、私が調査から思いついた最善の方法は、JAVA-COM(JACOB)http://sourceforge.net/projectsを使用することです(本当にJavaを何かに使用したい場合)。 / jacob-project /を使用すると、COM言語(AF)を介してWindowsタスクスケジューラhttp://msdn.microsoft.com/en-us/library/aa383581%28VS.85%29.aspxに接続できます。

私の知る限り、Javaを実行するには仮想マシン内にある必要があるため、PCの電源を入れるなどのアクションを実行する方法はありません。そのようなアクションが実行されるかどうかの問題にさえ入り込まないようにしましょう。管理者以上の権限が必要です。

お役に立てば幸いです。

于 2013-05-05T04:32:05.093 に答える