我尝试在Python中使用线程(ThreadingMixIn)编写TCPServer.问题是socket.error: [Errno 48] Address already in use当我尝试再次运行它时,我无法正常关闭它.这是触发问题的python代码的最小示例:
import socket
import threading
import SocketServer
class FakeNetio230aHandler(SocketServer.BaseRequestHandler):
def send(self,message):
self.request.send(message+N_LINE_ENDING)
def handle(self):
self.request.send("Hello\n")
class FakeNetio230a(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def __init__(self, server_address, RequestHandlerClass):
self.allow_reuse_address = True
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)
if __name__ == '__main__':
for i in range(2):
fake_server = FakeNetio230a(("", 1234), FakeNetio230aHandler)
server_thread = threading.Thread(target=fake_server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
# might add some client connection here
fake_server.shutdown()
Run Code Online (Sandbox Code Playgroud)
所有主要代码应该是启动服务器,关闭它并再次运行它.但它会触发上述错误,因为套接字在第一次关闭后尚未释放.
我认为这个设置self.allow_reuse_address = True可以解决问题,但这不起作用.当python程序完成后,我可以立即再次运行它,它可以启动服务器一次(但不是两次).
然而,当我随机端口(更换问题了1234由1234+i为例),因为没有其他服务器监听该地址.
有一个类似的SO Q 从ThreadingTCPServer正常关闭,但解决方案(设置allow_reuse_address为True …
boost::asio TCP 套接字接受/读/写都提供异步版本,但不关闭。
在我的代码中,我只是调用了 socket.close(),并且大部分时间它都可以正常工作。它触发了正常的 TCP 关闭。
但有时,close() 只是在没有关闭 TCP 的情况下关闭套接字。因此,我必须改为调用 shutdown()。但我不想阻止我的代码。在 boost:asio 中,shutdown() 是否阻塞?关闭()怎么样?close() 是否阻塞?
如何将自定义文本添加到关机屏幕,例如 Windows 在关机前安装更新时显示的那些消息?例如,您有一个在关机时执行的备份脚本,并且您想通知备份的进度,就像 Windows 在安装更新时所做的那样。是否有任何命令行工具,或某些代码库,甚至 Windows API 中的某些内容?
请注意,这不是关于如何关闭一台计算机,这是不是对什么方式来显示关机屏幕,如控制台应用程序或消息框的消息出现。这是不是对任何自定义现有的消息,这是没有任何关机对话框该节目之前关闭屏幕,并允许用户取消关机或继续,而不必等待终止的程序。
这是关于了解 Windows 如何实现这些消息的显示,它们在关闭时的显示方式,以及如何添加要显示的新消息,最好是带有进度信息。为了清楚起见,下面是屏幕截图。

我正在尝试通过命令提示符使用 C# 以编程方式远程关闭 PC,我已经做了一些搜索并找到了此类代码。
System.Diagnostics.Process.Start("shutdown", "/s");
Run Code Online (Sandbox Code Playgroud)
因为它没有指定要关闭的任何电脑,所以我尝试将该代码更改为我认为满足我的目标的代码。但事实证明这行不通。
System.Diagnostics.Process.Start("shutdown", "/s /m \\192.168.1.21 /t 5 /c 'Shutdown in 5 seconds'");
Run Code Online (Sandbox Code Playgroud)
C# 中没有异常,它只是不关闭。
我也尝试过这个,但没有运气。
System.Diagnostics.Process.Start("shutdown /s /m \\192.168.1.21 /t 5 /c 'Shutdown in 5 seconds'");
Run Code Online (Sandbox Code Playgroud)
C# 异常“系统找不到指定的文件”。
编辑:
我忘了告诉你,我已经设置了我的远程计算机和服务器,使其不会无法相互连接,例如关闭防火墙,配置本地系统策略以及更改网络和共享中心。
这个问题的核心是:是否可以通过Spring关闭钩子触发的方法执行事务?
目前,我有一个HyperSmartDbServer类,该类实现了SmartLifeCycle,如以下问题所示: 在spring bean中,可以有一个可以使用事务的shutdown方法吗?
我在该类中有一个标记为事务的方法,该方法作为stop方法的一部分被调用:
@Transactional
public void executeShutdown() {
hsqlDBShutdownService.executeShutdownQuery();
hsqlDBShutdownService.closeEntityManager();
}
Run Code Online (Sandbox Code Playgroud)
该方法中使用的服务有点麻烦,因为我无法在EntityManager中自动连线到此类:
@Service
public class HsqlDBShutdownService {
@PersistenceContext
private EntityManager entityManager;
@Autowired
private HyperSqlDbServer hyperSqlDbServer;
@Transactional
public void executeShutdownQuery() {
entityManager.createNativeQuery("SHUTDOWN").executeUpdate();
}
@Transactional
public void closeEntityManager() {
entityManager.close();
}
@PostConstruct
public void setHsqlDBShutdownService() {
hyperSqlDbServer.setShutdownService(this);
}
}
Run Code Online (Sandbox Code Playgroud)
您可能会注意到,我真正想完成的一切只是在停止服务器之前调用查询“ SHUTDOWN”。如果不这样做,则hsqldb锁定文件会在服务器重新启动时停留,并且服务器会引发异常。
上面的代码产生以下异常:
javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)
...
Run Code Online (Sandbox Code Playgroud)
所以我的原始问题仍然存在,但是如果有人对如何以另一种方式执行该查询有想法,我也会尝试一下。
仅供参考,我也尝试了@PreDestroy批注,但得到了相同的TransactionRequiredException。
编辑:为了完整起见,我在整个项目中都使用JpaTransactionManager和@Transactional批注,但关机时除外...
编辑2:数据源和事务管理器配置:
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:persistence.properties")
public class PersistenceConfig implements TransactionManagementConfigurer {
private static final String PASSWORD_PROPERTY = "dataSource.password"; …Run Code Online (Sandbox Code Playgroud) 我archlinux-2014.01.05-dual.iso在 VMware Player 上运行 Arch Linux(从 安装)并且已经安装vmtoolsd(属于open-vm-tools)。
现在我的问题是,每当我执行poweroff或 时reboot,系统只会给我留下一个黑屏,只有一个光标在左上角闪烁。如果我什么都不做,系统将在一两分钟内关闭或重新启动。
我已经在谷歌上搜索过这个问题。有些人建议我修改/usr/lib/systemd/system/vmtoolsd.service并为KillSignal=SIGKILLor添加一行TimeoutStopSec=2。但是,这些都不起作用。实际上,当我这样做时systemctl stop vmtoolsd,它似乎很快就会停止。
我想也许其他一些服务处于与我看到的那些帖子中讨论的状态类似的状态。是否有解决方法,以便我可以立即优雅地关闭我的虚拟机,或者我可以弄清楚在poweroff执行期间发生了什么,以便我可以判断是否有任何服务被阻止?
2014 年 3 月 4 日更新:现在问题变得奇怪了。我重新安装了 Arch Linux,但问题仍然存在。现在我想这可能不一定是vmtoolsd我安装的任何服务的问题,而是 VMware 工具或系统的问题。(但我确信 Ubuntu 在 VMware 中运行时不会出现此问题。)现在我正在尝试找出问题的真正原因。
顺便问一下,有没有报告说 Arch Linux 或其他基于它的系统在 VMware 中运行时有类似的问题?
2014 年 3 月 4 日更新:我使用了 Arch Linux Live CD,并且出现了类似的错误消息:A stop job is running for User Manager for 0。然后我认为这可能是这里报告的错误:https : //bugs.freedesktop.org/show_bug.cgi?id=70593这是一个错误 …
我已经在Amazon WebServices中触发了EC2实例。我也已经在/etc/init.d文件夹中创建了一个服务,它叫做shutdownSocketServer,我希望它在关闭和重启时被调用。
我已经将它添加到chkconfig -add中,并且我检查了它的定义
sudo chkconfig --list | grep shutdownSocketServer
shutdownSocketServer 0:on 1:off 2:off 3:off 4:off 5:off 6:on
The script is :
#/bin/bash
# chkconfig: 06 001 001
# description: Foo server
. /etc/init.d/functions
sudo touch /var/lock/subsys/shutdownSocketServer
start(){
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
echo "$EC2_INSTANCE_ID"
curl "http://mywebservice.com/Server/functions/SocketUpdater.php? estado=shutdown&instance_id=$EC2_INSTANCE_ID"
}
stop(){
echo "stopping"
}
### main logic ###
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart|reload|condrestart)
stop
start
;; …Run Code Online (Sandbox Code Playgroud) 首先,为了防止不喜欢读到最后的人将问题标记为重复,我已经阅读了“生产者-消费者日志服务”和“关闭问题的不可靠方式” 。但它并没有完全回答问题,并且回答与书本相矛盾。
在书中提供了以下代码:
public class LogWriter {
private final BlockingQueue<String> queue;
private final LoggerThread logger;
private static final int CAPACITY = 1000;
public LogWriter(Writer writer) {
this.queue = new LinkedBlockingQueue<String>(CAPACITY);
this.logger = new LoggerThread(writer);
}
public void start() {
logger.start();
}
public void log(String msg) throws InterruptedException {
queue.put(msg);
}
private class LoggerThread extends Thread {
private final PrintWriter writer;
public LoggerThread(Writer writer) {
this.writer = new PrintWriter(writer, true); // autoflush
}
public void run() {
try …Run Code Online (Sandbox Code Playgroud) 当我单击开始按钮时,此消息出现在我的 XAMPP 控制面板中。
此警告表明 MySQL 意外关闭,但 Apache 服务器运行良好。
11:29:21 AM [main] Starting Check-Timer
11:29:21 AM [main] Control Panel Ready
11:29:28 AM [main] Executing "c:\xampp\mysql"
11:29:50 AM [mysql] Attempting to start MySQL app...
11:29:51 AM [mysql] Status change detected: running
11:30:00 AM [mysql] Status change detected: stopped
11:30:00 AM [mysql] Error: MySQL shutdown unexpectedly.
11:30:00 AM [mysql] This may be due to a blocked port, missing dependencies,
11:30:00 AM [mysql] improper privileges, a crash, or a shutdown by another method.
11:30:00 …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我曾经像这样以编程方式停止 Wildfly (16.0.0.Final):
[...]
Thread shutdownThread = new Thread(){
@Override
public void run() {
try {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
try {
logger.info("Stopping server...");
ObjectName objectName = new ObjectName("jboss.as:management-root=server");
mBeanServer.invoke(objectName, "shutdown", new Object[] { false, 60 }, new String[] { boolean.class.getName(), int.class.getName() });
} catch ( InstanceNotFoundException | ReflectionException | MBeanException | MalformedObjectNameException e ) {
logger.error("Failed to stop server, error msg is: " + e);
}
} catch ( Exception e ) {
logger.error(e.getMessage(), e);
}
}
};
[...] …Run Code Online (Sandbox Code Playgroud)