谈谈 Linux 权限管理以及 Shell

首先对于一条 Linux 命令;

sh abc.sh -a  -b

可以理解成两个部分:

[command] [arg list]
  • Command可以是一个文件的路径,并且如果这个文件路径在环境变量中则可以直接使用命令代替文件路径。
  • arg list就是各种参数了
  • 执行一个命令必然需要权限,权限可以使用chmod进行修改

关于可执行权限

例如,我们使用如下代码:

sh abc.sh 

实际上是在使用 sh 执行一个 abc.sh,但是如果直接执行 abc.sh

./abc.sh

却会爆出Permission Denied的错误,这个是因为对于这个文件没有可执行权限。可以使用chmod添加可执行权限:

chmod +x abc.sh

然后就可以不加 sh 直接执行了

有了这些知识,编写 Cron 命令会干净很多。

Cron 的使用

Cron 这一个实现 Linux 命令自动化的工具。

比较常用的就是每隔一段时间自动执行一段脚本。

而我经常用到的情形就是每一次重启的时候执行一段特定的脚本。

配置

  • Ubuntu V18.06

基本使用

一个挺全的 Guidance: https://wiki.archlinux.org/index.php/Cron

安装

首先安装 cron

sudo apt-get install cron

基本使用

实际上记住两个命令就行:

# 显示 list
$ crontab -l  

# 编辑 task
$ crontab -e

编辑 Task 实现开机自动启动

我们执行以下 crontab -e 然后就会进入编辑窗口

@reboot [command]

实际上很简单, 对于一个开机启动的命令,只需要下面这一行:

@reboot forever start /home/ubuntu/project/abc.js

保存退出, 执行 sudo reboot 重启服务器,然后每次开机都可以自动跑一次 Forever 开启 Node 服务器

编辑 Task 实现定时启动

另外对于一些在特定实际执行特定任务,下面有一堆例子。

30 4 echo "It is now 4:30 am."
0 22 echo "It is now 10 pm."
30 15 25 12 echo "It is 3:30pm on Christmas Day."
30 3 * * * echo "Remind me that it's 3:30am every day."
0 * * * * echo "It is the start of a new hour."
0 6 1,15 * * echo "At 6am on the 1st and 15th of every month."
0 6 * * 2,3,5 echo "At 6am on Tuesday, Wednesday and Thursdays."
59 23 * * 1-5 echo "Just before midnight on weekdays."
0 */2 * * * echo "Every two hours."
0 20 * * 4 echo "8pm on a Thursday."
0 20 * * Thu echo "8pm on a Thursday."
*/15 9-17 * * 2-5 echo "Every 15 minutes from 9am-5pm on weekdays."
@yearly echo "Happy New Year!"

使用单文件管理所有 Task (可选)

现在你重启的时候可以自动跑 Node 服务器了,但是其实这样的命令管理还不够,建议将代码结构化。

因此我们将 cron 的命令改一改:

@reboot sh /home/ubuntu/nodeTask.sh

然后将 forever 的命令放到这个 .sh 中,以后仅仅需要修改 nodeTask.sh,甚至可以用 SFTP 进行编辑 task 细节

不过这样还不够清晰,我不想在这儿加上 sh 的命令,希望直接使用 .sh 作为命令。其实这里的原因就是 cron 使用 user 的权限而 user 没有可执行权限。

这时就会用到上面提到的,给这个 .sh 文件添加可执行权限。

chmod +x nodeTask.sh

然后 cron 命令又可以修改成:

@reboot /home/ubuntu/nodeTask.sh

命令干净多了。

系列文章

优雅地乱玩 Linux

参考文献