我想问一下现代Linux(内核3.x,4.x,5.x)中启动应用程序的方法,它们的优点和缺点。
我知道3种方法:
- 计划任务
- /etc/rc.local
- 系统脚本
但我不知道:
- 我什么时候应该使用哪种方法?
- 这些方法按什么顺序运行?
- 还有其他方法吗?
在这种特殊情况下,我需要启动一个脚本,该脚本执行 wvdial 并保持拨号连接。
我可以直接将其放入/etc/rc.local
并确保udev
finish/dev/ttySomeModem
存在、我的 USB 调制解调器驱动程序已加载吗?或者也许我必须使用systemd
并添加udev
依赖项?
我用来在连接调制解调器时udev
执行,并在调制解调器从大容量存储切换到调制解调器模式时生成到调制解调器串行端口的符号链接。usb_modeswich
/dev/ttyUSB*
答案1
让我先回答具体问题,然后我会概括一下以暗示您的 wvdial 问题的解决方案。
这些方法按什么顺序运行?
Cron 每分钟运行一次,并执行在该特定分钟到期的命令。 Cron 与启动无关,但它显然在机器关闭时不运行任何东西。
/etc/rc.local“最后”运行。对于 System V init(在 sysemd 之前),它是真的系统被视为启动之前运行的最后一件事。有了systemd,就跑了一旦网络启动,但与其他服务同时进行。
systemd 单元尽可能早地与其依赖项并行运行(请参阅Wants
和Requires
中的指令)系统单元(5)),并受到Before
和After
指令的约束。系统做出区分之间订购单位及其依赖关系。
我什么时候应该使用哪种方法?
如果您需要定期执行某些操作,请使用 Cron。通过 systemd,您还可以使用定时器为了这。
rc.local 很少是正确的答案,应该避免。考虑编辑适当服务的配置,更改该服务的脚本,或编写一个新脚本。看这篇博文对此进行扩展解释。
systemd 单位是您大多数时间应该使用的单位(但请参见下文)。在 System V 上,请改用服务。
还有其他方法吗?
您已经列出了主要的任务,但是还有用于其他一些任务的专门设施。例如,udev 可以根据某些事件运行脚本。 KDE 或 Gnome 等桌面环境提供自动启动功能。根据经验,在最有意义的时候做工作;例如,使用 KDE 自动启动来启动音频播放器,但使用 systemd 来启动 OpenSSH 服务器。
在这种特殊情况下,我需要启动一个脚本,该脚本执行 wvdial 并保持拨号连接。
这是一个有趣的例子:你需要初始化一个装置,然后运行一项服务。我能想到的最简单的方法是:
- 使用“systemd”标签标记您的设备,因此systemd 为其创建一个设备单元;
- 编写一个取决于设备单元的一次性单元。它应该运行
usb_modeswitch
并创建符号链接——与现有的 udev 处理程序所做的事情相同; systemctl edit wvdial.service
添加Requires=
和After=
指令,使 wvdial 依赖于您创建的一次性单元。这会延迟 wvdial 直到模式设置完成之后。
一种稍微更老套的方法是保留 udev 处理程序,并将 wvdial 服务修改为忙等待符号链接出现。
您可能还需要向 NetworkManager 传授有关 wvdial 的知识,以便 NM 知道在设备拔出然后插回时要重新拨号 - 但我不确定,因为我从未真正使用过调制解调器。