我的 shell 脚本没有使用 cron 选项卡运行。如果我使用 执行此脚本sudo ./myscript.sh
,一切正常。
myscript.sh
:
#!/bin/bash
if ! cd /var/www/myfolderapps/myfolderapp; then
echo 'Failed to cd to /some/dir' >&2
exit 1
fi
mv cms/configs/database.json ./
mv cms/configs/options.json ./
mv cms/configs/analytics.json ./
mv cms/sql/patchs.json ./
mv cms/public/uploads ./
mv cms/node_modules ./
rm -rf cms
git clone [email protected]:****/myproject.git
mv myproject cms
rm -rf ./cms/configs/database.json
rm -rf ./cms/configs/options.json
rm -rf ./cms/configs/analytics.json
rm -rf ./cms/sql/patchs.json
rm -rf ./cms/public/uploads
mv ./options.json ./cms/configs
mv ./database.json ./cms/configs
mv ./analytics.json ./cms/configs
mv ./patchs.json ./cms/sql
mv ./uploads ./cms/public
mv ./node_modules ./cms
cd cms
node sql/index.js
node scripts/mergeOptions.js
rm -rf ./tasks
rm -rf .bowerrc
rm -rf .eslintrc.json
rm -rf .gitignore
rm -rf .scss-lint.yml
rm -rf bower.json
rm -rf changelog-template.hbs
rm -rf CHANGELOG.md
rm -rf gulpfile.js
rm -rf README.md
cd ../
/usr/local/bin/pm2 restart process.json
exit;
我的应用程序正在运行到另一个文件夹:
Cloning into 'myproject'...
DEPRECATION WARNING: The logging-option should be either a function or false. Default: console.log
[PM2] Applying action restartProcessId on app [myfolderapp](ids: 0)
[PM2] [myfolderapp](0) ✓
┌─────────────────────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├─────────────────────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ myfolderapp │ 0 │ fork │ 5236 │ online │ 137478 │ 0s │ 0% │ 15.3 MB │ root │ disabled │
└─────────────────────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
答案1
您的脚本似乎假定它是使用特定目录作为其当前目录来执行的。确保在脚本开始时使用 正确设置当前目录cd
。
例如,如果cms
目录位于/some/dir
,则使用类似
#!/bin/bash
if ! cd /some/dir; then
echo 'Failed to cd to /some/dir' >&2
exit 1
fi
# rest of script goes here
/some/dir
如果该目录不存在或者当前用户cd
出于某种原因无法进入该目录,这将终止脚本并显示诊断消息。
如果您的git
命令(或任何其他实用程序)需要访问用户主目录中的文件(例如身份验证),则设置HOME
为非用户主目录的目录将导致该命令失败或无法按预期方式工作。该HOME
变量通常在执行 cron 作业时已正确设置,很少需要修改。
如果您需要修改PATH
变量来查找git
、node
或pm2
命令(或任何其他非标准命令),那么我会在脚本本身而不是 crontab 中执行此操作。PATH
crontab 中的设置将修改PATH
for全部由该选项卡安排的 cronjobs,在许多情况下可能不需要。
从错误输出的最后一行来看,至少pm2
在 default 中找不到该命令,因此有必要添加所在PATH
目录。pm2
PATH
您的脚本似乎也期望该cms
目录存在,并且它显然尝试将一些配置文件从该目录移至某个 Git 存储库的新目录签出。目前还不清楚如果cms
找不到目录会发生什么,或者为什么不直接git up
在目录中执行操作cms
。
您签出的 Git 存储库名为Gestiaweb
,但脚本需要一个名为 的目录Website
。目前尚不清楚这些名称是否相关或者是否Website
是预先存在的目录。