如何在 Ubuntu 16.04 中将命令行参数传递给 atd init 脚本

nic*_*ree 3 systemd 16.04

如何将命令行参数传递给 atd 守护进程,该参数将在重新启动和软件包升级后持续存在?我希望向-l 7.5atd添加命令行标志,因为我有一个 8-CPU 服务器并且不想在运行批处理作业之前等待负载级别低于编译值 1.5。

这里已经回答一个类似的问题,但该答案对 Ubuntu 16.04 无效,因为文件 /etc/init.d/atd.conf 不存在,并且我的 /etc/init 中没有“exec atd”行.d/atd 文件。)

与 /etc/init.d/ 中的大多数脚本不同,/etc/defaults/ 中没有相应的 atd 文件,因此我无法在其中进行任何编辑。

这是 /etc/init.d/atd 脚本:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          atd
# Required-Start:    $syslog $time $remote_fs
# Required-Stop:     $syslog $time $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Deferred execution scheduler
# Description:       Debian init script for the atd deferred executions
#                    scheduler
### END INIT INFO
#
# Author:       Ryan Murray <rmurray@debian.org>
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/atd
PIDFILE=/var/run/atd.pid

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

case "$1" in
  start)
        log_daemon_msg "Starting deferred execution scheduler" "atd"
        start_daemon -p $PIDFILE $DAEMON
        log_end_msg $?
    ;;
  stop)
        log_daemon_msg "Stopping deferred execution scheduler" "atd"
        killproc -p $PIDFILE $DAEMON
        log_end_msg $?
    ;;
  force-reload|restart)
    $0 stop
    $0 start
    ;;
  status)
    status_of_proc -p $PIDFILE $DAEMON atd && exit 0 || exit $?
    ;;
  *)
    echo "Usage: /etc/init.d/atd {start|stop|restart|force-reload|status}"
    exit 1
    ;;
esac

exit 0
Run Code Online (Sandbox Code Playgroud)

我曾尝试将 -l 7.5 添加到 start_daemon 部分的末尾,但这没有任何区别(尽管我的负载水平低于 7.5,但我的队列中仍有工作;并且ps -ef | grep atd | grep -v grepyields daemon 23192 1 0 07:57 ? 00:00:00 /usr/sbin/atd -f

ste*_*ver 5

你看到的是一个旧式的 SysV init 文件。尽管systemd提供了一种机制(为了向后兼容)以通过sysv init 兼容模式通过此类文件启动服务,但 Ubuntu 16.04 在这种情况下似乎没有这样做,因此您对 init 文件的更改被简单地忽略了 - 我不确定为什么文件仍然存在。

相反,该atd服务由systemd使用单元文件直接启动/lib/systemd/system/atd.service。但是,与其直接编辑该文件,不如使用systemctl edit@muru 的优秀回答如何覆盖或配置 systemd 服务来创建自定义配置

具体来说,

sudo systemctl edit atd
Run Code Online (Sandbox Code Playgroud)

然后添加例如

[Service]
ExecStart=
ExecStart=/usr/sbin/atd -l 7.5 -f
Run Code Online (Sandbox Code Playgroud)

保存退出,然后重启服务单元

sudo systemctl restart atd.service
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用以下命令确认您的更改已生效

systemctl status atd.service
Run Code Online (Sandbox Code Playgroud)

你应该看到类似的东西

? atd.service - Deferred execution scheduler
   Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enab
  Drop-In: /etc/systemd/system/atd.service.d
           ??override.conf
   Active: active (running) since Sat 2017-06-10 09:38:30 EDT; 8min ago
     Docs: man:atd(8)
 Main PID: 17247 (atd)
   CGroup: /system.slice/atd.service
           ??17247 /usr/sbin/atd -l 7.5 -f

Jun 10 09:38:30 xenial-vm systemd[1]: Started Deferred execution scheduler.
Run Code Online (Sandbox Code Playgroud)