我们知道如何使用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或任何其他语言进行操作?
答案 0 :(得分:15)
你需要一些东西来触发启动。触发这个的最好方法是Wake On Lan。
如果您想在Java中执行此操作,this可能是一个很好的资源。
答案 1 :(得分:4)
除了局域网唤醒之外,还有一些IPMI设备可以运行在连接到主板的某些服务器级硬件上,可以控制电源并通过网络连接提供串行控制台输出。这台计算机一直在运行,但我不熟悉你可以加载自己的代码。
您可以远程控制此设备,以便从任何语言(包括java。)中断电服务器。
http://en.wikipedia.org/wiki/Intelligent_Platform_Management_Interface
答案 2 :(得分:3)
如果您的BIOS支持高级电源管理(APM)1.2或更高版本,则应该可以根据计时器将其从睡眠/待机或休眠模式唤醒。在Windows上,最终用户可以通过任务计划程序执行此操作,如果您希望以编程方式执行此操作,则可以使用Task Scheduler interfaces。
我不知道你将如何通过Java实现这一目标,但这里有一些示例C代码将创建一个任务,以便在未来2分钟内唤醒计算机:
#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。
答案 3 :(得分:1)
我确实在互联网上找到了一个类似的问题,所以我会在这里发布链接,看看你是否觉得它有用。 (这是我发现的主题:http://www.coderanch.com/t/440680/gc/interact-Windows-Task-Scheduler-Java)
首先,我可以补充一点,Java是一种必须在虚拟机中运行的语言 - 没有两种方法可以解决它。我不太熟悉'低级'编程,比如在接近BIOS级别的编程,这是我们正在努力的方向。
由于问题明确是关于Java,我从研究中得出的最好的结果是(如果你真的想用Java做某事),使用JAVA-COM(JACOB)http://sourceforge.net/projects/jacob-project/允许您通过COM语言(AF
)挂钩到Windows任务计划程序http://msdn.microsoft.com/en-us/library/aa383581%28VS.85%29.aspx据我所知,由于Java需要在虚拟机中运行,因此无法让它执行诸如打开PC之类的操作 - 让我们甚至不知道是否有这样的问题行动需要管理员或以上特权。
希望有所帮助。