几个月前服务器的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. Linux awk工具简单学习记录

    awk是一个文本分析工具,它把文件逐行读入,以特定符号将每行切分(默认空格为分隔符),切开的部分再进行各种分析处理. awk其名称得自于它的创始人Alfred Aho .Peter Weinberge ...

  2. 【技巧总结】理解XXE从基础到盲打

    原文:http://agrawalsmart7.com/2018/11/10/Understanding-XXE-from-Basic-to-Blind.html 这篇文章中将讨论以下问题. XXE是 ...

  3. jquery实现模拟select下拉框效果

    <IGNORE_JS_OP style="WORD-WRAP: break-word"> <!DOCTYPE html PUBLIC "-//W3C// ...

  4. Python 3之str类型、string模块学习笔记

    Windows 10家庭中文版,Python 3.6.4, Python 3.7官文: Text Sequence Type — str string — Common string operatio ...

  5. python3 pandas DataFrame常见用法

    df = pandas.read_clipboard() df 获取索引和值 df.index df.values DataFrame的values属性将数据以二维ndarray形式返回,dtype类 ...

  6. JAVA 基础基本语法---常量与变量

    JAVA 基础基本语法---常量与变量 语法:计算机能够识别的语言的规则: 0. 基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hel ...

  7. LeetCode(15):三数之和

    Medium! 题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答 ...

  8. P4186 【[USACO18JAN]Cow at Large G】

    思路是覆盖子树,我们发现,农民想截住牛的最优策略是不断向上来尽可能地覆盖更大的子树 我们想要尽早地覆盖一个子树,一个显然的贪心是在这个子树中选取深度最小的一个放农民 如果我们在一个点放置了农民,那么其 ...

  9. GMM实战

    一道作业题: https://www.kaggle.com/c/speechlab-aug03 就是给你训练集,验证集,要求用GMM(混合高斯模型)预测 测试集的分类,这是个2分类的问题. $ hea ...

  10. VS C++ 并发编程

    1.VS2012及以上版本,支持C++11 thread类的并发编程. 相关材料可以参考博客:http://www.cnblogs.com/rangozhang/p/4468754.html 2.但对 ...