crontab 弹出窗口的问题 【摘自旧博】

本文介绍了如何使用CronTab在Linux环境下定时执行需要图形界面的应用程序。通过设置DISPLAY环境变量和配置X server,使得CronTab能够成功调用并显示这些应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

crontab 这个东西,想来大家已不陌生,利用crontab 用户可以指定 定时执行的程序,类似与windows上的计划任务(其实这个我倒是从来没用过)。
crontab 本身使用也不麻烦, 创建个 x.cron 文件,然后crontab x.cron 提交一下就搞定了, 或者直接crontab -e 编辑要定时调度的任务也可以。。(至于crontab文件的格式,google下到处都是啦,也比较easy,就不罗嗦了)
这样用,执行一般的不需要输出/或者弹出窗口的程序是没有问题的。。。
但是如果要调度的任务需要弹出窗口,那问题就来了。。任务不能被正确执行,同时你将收到一封
。。。。can not open display(null) 。。类似的邮件 :)
我的理解,cron本身是后台执行的程序,并没有与任何显示设备关联,因此,找不到显示设备,于是,当然显示不了了。。。。。没有指定显示设备,他怎么知道显示到那里去呢? 所以干脆不显示。。:P
    要指定显示设备就要涉及 DISPLAY 这个环境变量了。。
===================偷个懒,一下贴篇网上介绍 DISPLAY 的文章=======  
   在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:

DISPLAY=:0.0

使用xdpyinfo可以查看到当前显示的更详细的信息.

DISPLAY 环境变量格式如下host:NumA.NumB, host指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器. 如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式. 使用TCP方式连接时, NumA为连接的端口减去6000的值, 如果NumA为0, 则表示连接到6000端口; 使用unix socket方式连接时则表示连接的unix socket的路径, 如果为0, 则表示连接到/tmp/.X11-unix/X0 . NumB则几乎总是0.

如果使用su username或者su - username切换到别的用户, 并且使用命令

export DISPLAY=:0.0

设置DISPLAY环境变量, 运行图形程序(如xclock)时会收到如下错误:

Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

Error: Can't open display: :0.0

这是因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图形显示在当前屏幕上, 则应以当前登陆的用户, 也就是切换身份前的用户执行如下命令

xhost +

这个命令将允许别的用户启动的图形程序将图形显示在当前屏幕上.

在2台Linux机器之间, 如果设置服务器端配置文件/etc/ssh/sshd_config中包含

X11Forwarding no

客户端配置文件/etc/ssh/ssh_config包含

ForwardX11 yes

则从客户端ssh到服务器端后会自动设置DISPLAY环境变量, 允许在服务器端执行的图形程序将图形显示在客户端上. 在服务器上查看环境变量显示如下(这个结果不同的时候并不相同)

DISPLAY=localhost:10.0

在客户机上用netstat -lnp可以看到有程序监听了6010端口

tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN     4827/1

如果希望允许远程机器上的图形程序将图形显示在本地机器的Xserver上, 除了要设置远端机器的DISPLAY环境变量以外, 还需要设置本地机器的Xserver监听相应的TCP端口. 而现在的Linux系统出于安全的考虑, 默认情况下不再监听TCP端口. 可通过修改/etc/X11/xinit/xserverrc文件, 将

exec /usr/bin/X11/X -dpi 100 -nolisten tcp

修改为

exec /usr/bin/X11/X -dpi 100

允许在直接使用startx启动图形时启动对TCP端口的监听.

修改/etc/kde3/kdm/kdmrc, 将

ServerArgsLocal=-nolisten tcp

修改为

ServerArgsLocal=

允许kdm作为显示管理器时, 启动会话时监听相应的TCP端口.

修改/etc/gdm/gdm.conf, 在[Security]一节增加

DisallowTCP=false

或者在登陆窗口选择"Options" -> "Configure Login Manager..."的Security页面, 取消"Deny TCP connections to Xserver", 允许gdm作为显示管理器时, 启动会话时监听相应的TCP端口.
===============================================
ssh的部分,可以不管,
Xserver的部分按照上面配一下就可以了,大提就是指定显示设备,然后开启监听端口。。。
不出意外,应该就可以利用crontab 定时弹出窗口了。。
贴条sample code:
  26  * * * * (export DISPLAY=:0.0 && /usr/bin/gedit )
每个小时26分弹出 gedit :) 注意  export DISPLAY=:0.0 不能省。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
对cron 了解并不深入,仅供参考 ;)

 

 发表于: 2007-08-14,修改于: 2007-08-14 14:51
<think>好的,用户想要定时执行一个exe程序,而且不能弹出窗口。首先,我需要考虑用户的具体需求。他们可能希望这个程序在后台静默运行,不干扰他们的正常工作或使用电脑。常见的应用场景可能是自动化脚本、数据备份、系统维护等。 接下来,我需要确定用户的操作系统。虽然用户没有明确说明,但常见的定时任务工具如Windows任务计划程序或Linux的Cron,所以可能需要涵盖这两个平台。不过考虑到用户提到exe文件,这通常是Windows的可执行文件,所以可能主要针对Windows环境。 用户强调不能弹出窗口,这意味着需要以隐藏或静默模式运行程序。在Windows中,通常运行exe时会有一个命令行窗口一闪而过,或者如果程序是GUI应用,可能会显示界面。因此,需要找到方法让程序在后台运行,不显示任何窗口。 首先想到的是使用Windows任务计划程序。这是一个内置工具,可以设置定时任务。但如何配置才能隐藏窗口呢?在创建任务时,有一个选项是“运行任务时隐藏”或类似的设置,可能需要在安全选项中配置用户账户,或者使用特定的参数。 另外,可能需要使用命令行工具来启动程序,并添加参数使其静默运行。例如,使用start /B来在后台启动程序,但不确定是否适用于所有exe。有些程序可能有自己的静默参数,比如/S或/silent,这需要用户知道该exe是否支持这样的选项。 如果任务计划程序无法完全隐藏窗口,可能需要借助第三方工具或编写脚本。例如,使用VBScript或PowerShell脚本启动exe,并设置为隐藏窗口。VBScript中的CreateObject("WScript.Shell").Run命令可以将窗口样式设置为隐藏。 此外,用户可能需要管理员权限来设置某些任务,尤其是如果exe需要访问受保护的系统资源。这时候需要提醒用户注意权限问题,或者配置任务以最高权限运行。 还需要考虑日志记录和错误处理。如果程序在后台运行,用户可能无法看到错误提示,因此建议添加日志记录功能,将输出重定向到文件,方便后续排查问题。 总结下来,可能的解决方案步骤包括: 1. 使用Windows任务计划程序创建任务,设置触发器、操作,并配置隐藏选项。 2. 如果需要,使用脚本(如VBScript、PowerShell)来启动exe并隐藏窗口。 3. 检查exe是否支持静默运行参数,并在任务中配置这些参数。 4. 设置日志记录,确保程序运行状态可追踪。 需要验证这些步骤是否可行,特别是隐藏窗口的部分。例如,在任务计划程序中,即使勾选了“隐藏”选项,某些程序仍可能弹出窗口,这可能取决于程序本身的设计。因此,可能需要结合多种方法,如任务计划程序和脚本的组合使用,来确保窗口弹出。 另外,可能需要提醒用户测试任务,在设置完成后手动运行一次,观察是否有窗口弹出,并根据测试结果调整配置。例如,如果通过任务计划程序运行仍有窗口,可能需要改用脚本方式。 最后,如果用户对编程或脚本不熟悉,可能需要推荐一些第三方工具,例如nssm(Non-Sucking Service Manager)将exe安装为服务,或者使用AutoHotkey编写脚本自动执行。不过第三方工具需要用户下载安装,可能存在安全风险,需谨慎建议。</think>### 定时静默执行exe的解决方案 #### 一、需求核心 1. **定时触发**:在指定时间或周期运行程序 2. **无窗口模式**:禁止弹出任何界面(包括命令行黑框) --- #### 二、Windows系统推荐方案 **方法1:任务计划程序 + 静默参数** 1. 打开任务计划程序(Win+R → 输入`taskschd.msc`) 2. 创建基本任务: - **触发器**:设置定时规则(每日/每周/启动时等) - **操作**:选择"启动程序" - **程序路径**:填写exe完整路径(如`C:\MyApp\app.exe`) - **参数**(可选):添加静默参数(常见选项:`/SILENT`、`/VERYSILENT`、`/qn`) 3. 关键配置: ```plaintext [操作] → 勾选"隐藏"选项 [条件] → 取消"只有在计算机使用交流电源时才启动此任务" [设置] → 选择"如果任务失败,重新启动间隔"(可选) ``` **方法2:VBScript隐藏启动** 1. 新建`.vbs`文件(如`run_hidden.vbs`): ```vbscript Set WshShell = CreateObject("WScript.Shell") WshShell.Run "C:\MyApp\app.exe", 0 Set WshShell = Nothing ``` > 参数`0`表示完全隐藏窗口 2. 在任务计划程序中设置启动该vbs脚本 --- #### 三、Linux系统方案 **使用Cron + nohup** ```bash # 编辑crontab crontab -e # 添加定时任务(示例:每天03:00执行) 0 3 * * * nohup /path/to/app.exe >/dev/null 2>&1 & ``` --- #### 四、进阶技巧 1. **日志记录**(推荐添加): ```vbscript ' 在vbs脚本中追加日志功能 WshShell.Run "cmd /c C:\MyApp\app.exe > C:\logs\app.log 2>&1", 0 ``` 2. **第三方工具**: - **nssm**:将exe转换为系统服务 - **SilentCMD**:静默执行批处理文件 --- #### 五、注意事项 1. 部分程序(如需要用户交互的GUI应用)无法完全隐藏窗口 2. 涉及系统权限时需使用管理员账户配置任务 3. 建议首次测试时设置短间隔(如5分钟后),验证功能有效性 通过以上配置,可实现程序在后台完全静默运行,适用于自动化数据处理、服务监控等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值