几个月前服务器的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程序的更多相关文章

  1. 如何在Linux中使用Firejail运行应用程序

    有时您可能希望使用在不同环境中未经过良好测试的应用程序,但您必须使用它们.在这种情况下,关注系统的安全性是正常的.在Linux中可以做的一件事是在沙箱中使用应用程序. “沙盒”是在有限环境中运行应用程 ...

  2. 在windows中:双击运行Python程序、后台运行Python程序

    在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...

  3. 在 Sublime Text 2 中编译和运行 Java 程序,以及输出中文出错问题解决办法

    Sublime Text 2 是我最喜欢用来编码的文本编辑器,如果你尝试使用后相信你也会喜欢上它的.在这篇文章中我们将讨论如何在 Sublime Text 2 中编译和运行 Java 程序. 第一步: ...

  4. "无法启动程序,因为计算机中丢失*.dll” 运行exe错误解决方法

    笔者把编译生成的win32 Release exe文件复制到另外一台电脑上,却发现程序不能运行,报错如下: 报错提示缺失动态链接库pcl_common_release.dll,那为什么在编译生成的电脑 ...

  5. Python中四种运行其他程序的方式

    原文地址:http://blog.csdn.net/jerry_1126/article/details/46584179 在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在 ...

  6. Python黑科技 | Python中四种运行其他程序的方式

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  7. J2EE项目中后台定时运行的程序

    转自:http://www.2cto.com/kf/201311/260676.html 在开发J2EE项目中,有时候需要在后台定时执行一些代码. 比如定时对web数据建立倒排索引.定时发送邮件.定时 ...

  8. C#中调用Windows系统服务exe程序的工具类与重启服务的流程

    场景 使用C#编写的Windows服务程序,在Winform中进行调用. 常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法. 以在Winform中重启服务为例. 注: 博 ...

  9. Ubuntu中使用终端运行Hadoop程序

    接上一篇<Ubuntu Kylin系统下安装Hadoop2.6.0> 通过上一篇,Hadoop伪分布式基本配好了. 下一步是运行一个MapReduce程序,以WordCount为例: 1. ...

随机推荐

  1. artDialog学习之旅(二)之扩展方法详解

    名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集 ...

  2. 日常训练赛 Problem C – Complete Naebbirac’s sequence

    比赛链接https://vjudge.net/contest/256988#status/17111202012/C/0/ 大意:三个操作,使得输入的数中,从1-n,每一个数出现的次数相同. wa代码 ...

  3. Android View坐标系详解(getTop()、getX、getTranslationX...)

    View 提供了如下 5 种方法获取 View 的坐标:1. View.getTop().View.getLeft().View.getBottom().View.getRight();2. View ...

  4. 安装odbc驱动

    1.下载对应的驱动 (32位/64位) http://www.oracle.com/technetwork/database/database-technologies/instant-client/ ...

  5. mysql主键的缺少导致备库hang

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...

  6. 清理电脑文件夹中的Thumbs.db文件

    @echo off del f:Thumbs.db /f/s/q/a exit 对应修改磁盘号, 保存批处理文件执行即可

  7. vistual studio 去除 git 源代码 绑定

    第一次碰到这个问题,想将源代码签入TFS管理.添加到源码管理后,默认添加到Git源码管理. 研究过后,发现: 1)删除框内文件 2)Vs->工具->选项->源代码管理->插件管 ...

  8. LINUX下IDEA等工具调试项目时提示:Unable to open debugger port

    在Ubuntu下调试项目时使用TOMCAT容器,在设置好相应的TOMCAT LOCAL 路径及相关信息后,点击调试项目出现: Unable to open debugger port : java.n ...

  9. 为什么尽量别用 setInterval

    为什么尽量别用setInterval   在开发一个在线聊天工具时,经常会有过多少毫秒就重复执行一次某操作的需求.“没问题”,大家都说,“用setInterval好了.”我觉得这个点子很糟糕. 原因之 ...

  10. python的map,filter,reduce学习

    python2,python3中map,filter,reduce区别: 1,在python2 中,map,filter,reduce函数是直接输出结果. 2,在python3中做了些修改,输出前需要 ...