在CentOS 6 的cron/crontab中使用wine运行exe程序
几个月前服务器的OS从Ubuntu 10.04转为CentOS 6.3,装好wine后手动运行shell脚本可以正常运行指定的exe程序(脚本和Ubuntu中的一样),于是就直接修改crontab定时自动运行该脚本。
最近却才发现该exe并未自动执行过一次(大汗,该exe作用为备份数据库、清空过时备份),于是立刻去查找问题原因,初步推测为以下几点:
1.crontab配置出错
原来的配置为每2小时运行一次,改为每3分钟运行一次。查看crontab日志(/var/log/cron 系列日志),发现的确是每3分钟运行一次crontab配置中的脚本(日志中有记录)。在图形界面运行该脚本,功能正常。结论为crontab配置并未出错,脚本确实是每2小时运行一次。
2.wine运行该exe程序失败
在shell脚本中将wine运行exe的正常输出及异常输出重定向到指定文件(&>> 追加到文件末尾)。于是发现初步原因:
wine: '/' is not owned by you, refusing to create a configuration directory there
奇怪的错误,明明已经在该用户的界面运行过winecfg,自动生成了wine的配置文件夹的啊。于是google一下(PS:我那时候用百度只搜到Ubuntu中文论坛中的“wine: '/home/username' is not owned by you, 不让用呀!”解决方法是检查该用户主目录所属和权限是否正确),发现简单的解决方法是执行前设置一个wine变量——$WINEPREFIX,具体方法是
export WINEPREFIX=/home/username/.wine
或
env WINEPREFIX=/home/username/.wine
这只会在本shell及其子shell中生效。终于可以执行wine……查看日志发现wine虽然可以运行,但是继续报错;exe程序输出的中文也变成了?。
我选择先解决exe输出中文乱码的问题,也就是字符编码问题。在shell脚本中输出一下
echo $LANG &>> yourlog
于是发现手动运行与自动运行的区别,手动是zh_CN.UTF-8,自动是en_US.UTF-8……好办,相同的处理方法,执行前设置变量LANG为zh_CN.UTF-8,成功输出中文。
再解决wine的报错
err:menubuilder:write_freedesktop_mime_type_entry error writing file //.local/share/mime/packages/x-wine-extension-cpl.xml
这个时候我开始怀疑CentOS的crontab执行指定用户的命令时缺少了一些必要的初始化操作。再次google,在wine的官网发现类似的问题
err:menubuilder:write_freedesktop_mime_type_entry error writing file /home/mark/.local/share/mime/packages/x-wine-extension-cpl.xml
仔细比较,mark的该xml文件是在自己的主目录下的!输出一下主目录
echo $HOME &>> yourlog
手动是/home/username,自动是……空,无语问苍天。相同的处理方法,执行前设置变量LANG为/home/username,成功解决wine的报错。
结语
至此,可以确认CentOS的crontab执行指定用户的命令时缺少了一些必要的初始化操作,例如用户语言,用户主目录,命令路径(PATH)等等。我只能确定whoami是输出正确的(大汗),各位若遇到类似的环境变量初始化问题(不只是wine),大可打开/etc/profile和/etc/profile.d/中看看CentOS究竟会在用户登陆时做了那些设置。但还有一些变量如HOME、WINEPREFIX未找到初始化的语句,各位如知道请留言。
由于crontab为后台运行,不提供图形界面,所以如果exe程序带图形界面,wine语句前可能必须加上”DISPALY=:0 “
DISPLAY=:0 wine ***.exe >> yourlog.log
PS1:我的CentOS 6.3的crontabs版本为1.10-33.el6,Ubuntu 10.04的cron为3.0pl1-106ubuntu5
PS2:当正确设置了HOME而未设置WINEPREFIX时,wine不会报错。这是我写此文章时再次测试才发现的,所以“教授别人时也能提升自己”。
本文为原创内容,转载请注明出处。
在CentOS 6 的cron/crontab中使用wine运行exe程序的更多相关文章
- 如何在Linux中使用Firejail运行应用程序
有时您可能希望使用在不同环境中未经过良好测试的应用程序,但您必须使用它们.在这种情况下,关注系统的安全性是正常的.在Linux中可以做的一件事是在沙箱中使用应用程序. “沙盒”是在有限环境中运行应用程 ...
- 在windows中:双击运行Python程序、后台运行Python程序
在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...
- 在 Sublime Text 2 中编译和运行 Java 程序,以及输出中文出错问题解决办法
Sublime Text 2 是我最喜欢用来编码的文本编辑器,如果你尝试使用后相信你也会喜欢上它的.在这篇文章中我们将讨论如何在 Sublime Text 2 中编译和运行 Java 程序. 第一步: ...
- "无法启动程序,因为计算机中丢失*.dll” 运行exe错误解决方法
笔者把编译生成的win32 Release exe文件复制到另外一台电脑上,却发现程序不能运行,报错如下: 报错提示缺失动态链接库pcl_common_release.dll,那为什么在编译生成的电脑 ...
- Python中四种运行其他程序的方式
原文地址:http://blog.csdn.net/jerry_1126/article/details/46584179 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在 ...
- Python黑科技 | Python中四种运行其他程序的方式
在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...
- J2EE项目中后台定时运行的程序
转自:http://www.2cto.com/kf/201311/260676.html 在开发J2EE项目中,有时候需要在后台定时执行一些代码. 比如定时对web数据建立倒排索引.定时发送邮件.定时 ...
- C#中调用Windows系统服务exe程序的工具类与重启服务的流程
场景 使用C#编写的Windows服务程序,在Winform中进行调用. 常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法. 以在Winform中重启服务为例. 注: 博 ...
- Ubuntu中使用终端运行Hadoop程序
接上一篇<Ubuntu Kylin系统下安装Hadoop2.6.0> 通过上一篇,Hadoop伪分布式基本配好了. 下一步是运行一个MapReduce程序,以WordCount为例: 1. ...
随机推荐
- mitmproxy实践
首先附上github地址:https://github.com/mitmproxy/mitmprox,上面的内容永远是最新的 作为一名测试穿戴设备相关app的工程师,与数据打交道是常事,那么,如果想要 ...
- 002_docker构建zookeeper环境
最近因为要维护公司zk环境,所以自己先得搞一套先玩玩 git地址=>https://github.com/jplock/docker-zookeeper/tree/v3.4.9 一.build ...
- java虚拟机规范(se8)——java虚拟机结构(二)
2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区 ...
- Android 拍摄(横\竖屏)视频的懒人之路
想一想,我们聊过AudioReord,AudioTrack,MediaPlayer,那多媒体四大金刚,就剩下了MediaRecorder了(SoundPool?我这里信号不好···).其实MediaR ...
- ERP渠道信息的修改和渠道联系记录(二十三)
用例图: 前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Cha ...
- Java编程的逻辑 (27) - 剖析包装类 (中)
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- JavaScript——双向链表实现
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- Unit的各种断言
今天遇到这个问题,就值得自己总结一下. 1.介绍 JUnit为我们提供了一些辅助函数,他们用来帮助我们确定被测试的方法是否按照预期的效果正常工作,通常,把这些辅助函数称为断言.下面我们来介绍一下JUn ...
- HttpRequest中常见的四种Content-Type(转)
add by zhj: Content-Type用于说明request body的编码格式的,对于没有request body的http method如GET,HEAD没有必要设置这个参数,当然,你设 ...
- Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...