Ubuntu 16.04 で atd init スクリプトにコマンドライン引数を渡す方法

Ubuntu 16.04 で atd init スクリプトにコマンドライン引数を渡す方法

再起動やパッケージのアップグレード後も保持されるコマンドライン引数を atd デーモンに渡すにはどうすればよいですか? -l 7.58 CPU サーバーを使用しており、バッチ ジョブを実行する前に負荷レベルがコンパイルされた値 1.5 を下回るまで待機したくないため、atd にコマンドライン フラグを追加したいと考えています。

(同様の質問が回答されていますここただし、この回答は Ubuntu 16.04 では無効です。/etc/init.d/atd.conf ファイルが存在せず、/etc/init.d/atd ファイルに「exec 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 <[email protected]>
#

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

start) セクションの start_daemon 行の末尾に -l 7.5 を追加してみましたが、何も変わりませんでした (負荷レベルが 7.5 未満であるにもかかわらず、キューにジョブがまだ残っており、次の結果がps -ef | grep atd | grep -v grep出ますdaemon 23192 1 0 07:57 ? 00:00:00 /usr/sbin/atd -f)

答え1

ここで見ているのは、古いスタイルのSysV initファイルです。systemd後方互換性のために、このようなファイルを介してサービスを開始するためのメカニズムを提供していますが、sysv init 互換モードこの場合、Ubuntu 16.04 ではそのようには行われないようです。そのため、init ファイルへの変更は単に無視されます。ファイルがまだ存在している理由はわかりません。

代わりに、サービスはユニットファイルを使用してatdによって直接起動されます。ただし、そのファイルを直接編集するのではなく、 @muruの優れた回答で説明されているように、 を使用してカスタム構成を作成する必要があります。systemd/lib/systemd/system/atd.servicesystemctl editsystemd サービスを上書きまたは構成するにはどうすればよいですか?

具体的には、

sudo systemctl edit atd

次に例えば

[Service]
ExecStart=
ExecStart=/usr/sbin/atd -l 7.5 -f

保存して終了し、サービスユニットを再起動します

sudo systemctl restart atd.service

その後、変更が有効になったことを確認するには、

systemctl status atd.service

次のような画面が表示されるはずです

● 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.

関連情報