我在 ruby 文件中编写了用于重启某些服务、终止进程并运行的 shell 脚本,它成功了。我想每小时运行一次这个 shell 脚本,因此我将 bash 命令放入 crontab,cron 每小时运行一次,但我的 shell 脚本只执行终止进程,最后三个命令(运行 3 个 ruby 文件)不执行。
重启
sudo pkill -9 -f '/home/myuser/.rvm/rubies/ruby-2.4.0/bin/ruby /home/myuser/subscribe.rb'
sudo pkill -9 -f '/home/myuser/.rvm/rubies/ruby-2.4.0/bin/ruby /home/myuser/retry1.rb'
sudo pkill -9 -f '/home/myuser/.rvm/rubies/ruby-2.4.0/bin/ruby /home/myuser/retry2.rb'
sleep .5
nohup /home/myuser/.rvm/rubies/ruby-2.4.0/bin/ruby /home/myuser/subscribe.rb &!
nohup /home/myuser/.rvm/rubies/ruby-2.4.0/bin/ruby /home/myuser/retry1.rb &!
nohup /home/myuser/.rvm/rubies/ruby-2.4.0/bin/ruby /home/myuser/retry2.rb &!
定时任务
0 */1 * * * bash -lc "/home/myuser/restart.sh"
答案1
最后,我找到了一个解决办法。
问题的关键不在于权限,而在于与 cron 执行的 shell 环境不同,尤其是运行 ruby 文件。
因为我用于rvm
管理 ruby 版本,所以我找到了示例
#!/usr/bin/env bash
# load rvm ruby
source /usr/local/rvm/environments/ruby-2.1.1@projectX
bundle install
ruby /path/to/script.rb
rake do something
来源 :https://rvm.io/integration/cron#example-script
因此,我修改了我的 shell 脚本如下:
#!/usr/bin/env bash
sudo pkill -9 -f 'ruby /home/myuser/subscribe.rb'
sudo pkill -9 -f 'ruby /home/myuser/retry1.rb'
sudo pkill -9 -f 'ruby /home/myuser/retry2.rb'
sleep .5
source /home/mysuser/.rvm/environments/ruby-2.4.0
nohup ruby /home/myuser/subscribe.rb &
nohup ruby /home/myuser/retry1.rb &
nohup ruby /home/myuser/retry2.rb &