我的计划表:
* * * * * ~/d2gs.sh
我的应用程序:
#!/bin/sh
#
# D2GS
#
# Go to the directory
cd ~
# Run the applications
if ! ps aux | pgrep "D2GS"; then
wine "C:/D2GS/D2GS.exe" > /dev/null 2>&1 &
fi
crontab 没有启动该进程。这很奇怪,因为我可以手动成功运行 ~/d2gs.sh 。
答案1
您必须区分“crontab 未启动该进程”和“该进程确实启动但未执行其应有的操作”。并确保该文件是可执行的。
与我假设的相反,使用~
incrontab
不是问题。整个命令字符串被传递到 shell。
答案2
可能cd ~
不起作用(因为波形符扩展不是通用的)。更喜欢cd $HOME
它(保证对/bin/sh
...的所有实现都做同样的事情).....请记住,POSIX sh
(或/bin/sh
)通常是不是 bash
(你的/bin/sh
可能不完全符合 POSIX,但更像“bourne”)!
当然,您可以pwd > /dev/stderr
在脚本中添加类似的内容(用于调试目的)。
wine
一般需要一个X11服务器来显示窗口。而且一个程序启动时cron
一般不需要任何X11服务器或终端。所以wine
可能无法(从你的cron
工作开始)。您可能需要设置一些DISPLAY
变量扩展库。但你可能会使用 Xvfb,请参阅这里。
终于,pgrep(1)正在扫描进程。要么单独使用ps aux | grep "D2GS"
,要么学习如何使用pgrep
。
我建议使用echo something > /dev/stderr
或更好echo
或打印(1)(用合适的重定向) 或者记录器(1)在您的脚本中,至少出于调试目的(在多个地方)。
至少在调试阶段我不会将wine
-s stderr 和 stdout 重定向到。/dev/null
你不能编码吗(至少暂时地在调试期间) 并 使用一些寻呼机wine "C:/D2GS/D2GS.exe" >> /tmp/wine.out 2>&1
进行研究,例如?/tmp/wine.out
less
你的cron
(和你的 shell 脚本)没有使用你的交互PATH
多变的。你应该考虑设置它明确地在你的脚本中(或crontab
)。看环境(7)。