关于批处理shutdown的一个简单问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于批处理shutdown的一个简单问题相关的知识,希望对你有一定的参考价值。

大家一定用过批处理,今天我发现一个非常怪的问题。问题如下:
在任意目录下新建一个bat文件,命名为shutdown.bat 。其中代码为

@echo off
shutdown -s

就这短短的两句话就是运行不了,但是一旦把文件名改为其他任意(个人人认为)文件名就可以运行了。
请问各位高手这是什么原因。菜鸟谢过。

系统:Win2003
硬件:图拉丁1.0 SDRAM256M
我问的不是怎么用shutdown这个命令,而是为什么其他文件名可以运行,就"shutdown.bat"不能运行。

我也试了,的确如此。
但是你在批处理中,把shutdown 写完整,就是写成shutdown .exe 就可以了。

原因就是:
shutdown.bat在执行的时候会认为你那个shutdowm -s命令是在调用shutdown.bat文件自身,肯定会死循环。
myshutdown.bat在执行的时候遇到shutdowm -s命令,会去调用C:\WINDOWS\shutdown.exe,这样才能实现关机。
参考技术A 因为shutdown被那个.bat重名占用,运行的话会无休止的重复执行这个bat,无法执行到系统的shutdown 参考技术B @echo off
set /p t=你要多少秒关机:(单位秒 如 60)
shutdown -s -t %t%
参考技术C Win2003 是服务器哦 参考技术D 批处理中,写shutdown.exe就可以了,如下:
@echo off
shutdown.exe -s

使用 register_shutdown_function() 处理 PHP 中的致命错误

【中文标题】使用 register_shutdown_function() 处理 PHP 中的致命错误【英文标题】:Handle fatal errors in PHP using register_shutdown_function() 【发布时间】:2011-05-23 13:50:31 【问题描述】:

根据the comment on this answer,可以通过shutdown function 捕获致命错误,而使用set_error_handler() 无法捕获。

但是,我不知道如何确定关闭是由于致命错误还是由于脚本到达结尾而发生的。

此外,调试回溯功能似乎在关闭功能中失效,使得记录发生致命错误的堆栈跟踪变得毫无价值。

所以我的问题是:对致命错误(尤其是未定义的函数调用)做出反应,同时保持创建适当回溯的能力的最佳方法是什么?

【问题讨论】:

【参考方案1】:

这对我有用:

function shutdown() 
    $error = error_get_last();
    if ($error['type'] === E_ERROR) 
        // fatal error has occured
    


register_shutdown_function('shutdown');

spl_autoload_register('foo'); 
// throws a LogicException which is not caught, so triggers a E_ERROR

但是,您可能已经知道了,但只是为了确保:您无法以任何方式从 E_ERROR 中恢复。

至于回溯,你不能...... :( 在大多数致命错误的情况下,尤其是 Undefined function 错误,你并不真正需要它。精确定位文件/行它发生在哪里就足够了。在这种情况下,回溯是无关紧要的。

【讨论】:

您应该在条件前面加上“$error !== null &&”。否则会在以前没有错误时触发。【参考方案2】:

使用 register_shutdown_function 区分致命错误和正确关闭应用程序的一种方法是将一个常量定义为程序的最后一行,然后检查该常量是否已定义:

function fatal_error() 
if ( ! defined(PROGRAM_EXECUTION_SUCCESSFUL)) 
        // fatal error has occurred
    


register_shutdown_function('fatal_error');

define('PROGRAM_EXECUTION_SUCCESSFUL', true);

如果程序结束,它不可能遇到致命错误,所以如果定义了常量,我们知道不运行该函数。

error_get_last() 是一个数组,其中包含有关您应该需要调试的致命错误的所有信息,尽管如前所述,它没有回溯。

一般来说,如果您的 php 程序遇到了致命错误(而不是异常),您希望程序崩溃,以便找到并解决问题。我发现 register_shutdown_function 对于您希望关闭错误报告的生产环境很有用,但需要某种方式在后台记录错误以便您可以响应它。如果出现此类错误,您还可以使用该功能将用户引导至友好的 html 页面,这样您就不会只是提供空白页面。

【讨论】:

【参考方案3】:

获取当前 error_handler 方法只是一个不错的技巧 =)

<?php
register_shutdown_function('__fatalHandler');
function __fatalHandler()

    $error      = error_get_last();

    //check if it's a core/fatal error, otherwise it's a normal shutdown
    if($error !== NULL && $error['type'] === E_ERROR) 
        //Bit hackish, but the set_exception_handler will return the old handler
        function fakeHandler()  
        $handler = set_exception_handler('fakeHandler');
        restore_exception_handler();
        if($handler !== null)  
            call_user_func($handler, new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line']));
        
        exit;
    

?>

如果你打电话,我也不想注意

<?php
ini_set('display_errors', false);
?>

Php 停止显示错误,否则错误文本将在您的错误处理程序之前发送到客户端

【讨论】:

以上是关于关于批处理shutdown的一个简单问题的主要内容,如果未能解决你的问题,请参考以下文章

关于C# Thread的简单问题

Java 线程池关闭

线程池中断 任务如何处理

如何写脚本文件

Linux系统卡死了怎么处理

关于分块的简单介绍