systemctl เปิดใช้งานแตกต่างจาก systemctl start อย่างไร


16

ฉันใช้กล่อง Arch Linux (ล่าสุด, ทันสมัย) และพยายามให้ MySQL เริ่มบูต เมื่อติดตั้งแพ็คเกจ systemd ฉันมี systemctl และฉันสามารถทำสิ่งนี้ได้:

systemctl start mysqld.service
systemctl [stop|status|restart] mysqld.service

มันใช้ได้ทั้งหมดและใช้งานได้ดีเมื่อฉันต้องการเริ่ม / หยุดด้วยตนเองอย่างไรก็ตามเมื่อมันเริ่มต้นด้วยการบูต (โดยใช้ 'เปิดใช้งาน' ที่ systemctl ฉันจะได้ผลลัพธ์ที่น่ารังเกียจ):

[root@rudivarch ~]# systemctl enable mysqld.service
Failed to issue method call: No such file or directory

เห็นได้ชัดว่าเนื่องจากคำสั่งอื่น ๆ ใช้งานได้ดีฉันสับสนอย่างมากและใช้เวลาในขณะที่พยายามคิดออก ... สถานะ systemctl แสดงผลลัพธ์นี้:

[root@rudivarch ~]# systemctl status mysqld.service
mysqld.service
     Loaded: loaded (/etc/rc.d/mysqld)
     Active: inactive (dead) since Tue, 31 Jan 2012 15:32:28 +0000; 1min 25s ago
    Process: 589 ExecStop=/etc/rc.d/mysqld stop (code=exited, status=0/SUCCESS)
    Process: 257 ExecStart=/etc/rc.d/mysqld start (code=exited, status=0/SUCCESS)
    CGroup: name=systemd:/system/mysqld.service

มีใครมีความคิดว่าทำไม 'เปิดใช้งาน' ไม่ทำงาน?

คำตอบ:


19

mysqld.serviceเป็นหน่วย "เสมือน" - ไม่มีอยู่ในระบบไฟล์มันเป็นเพียงส่วนหนึ่งของเลเยอร์ความเข้ากันได้ของ systemd คุณสามารถเริ่มต้นได้และ systemd จะรัน/etc/rc.d/mysqldinitscript ดั้งเดิมแต่คุณทำไม่systemctl enableได้เพราะคุณต้องการ.serviceไฟล์จริงซึ่งสามารถเชื่อมโยงไปยังตำแหน่งที่เหมาะสม

คุณสามารถเขียนหน่วยดังกล่าวด้วยตัวเองและใส่ไว้ใน/etc/systemd/system/mysqld.service:

[Unit]
คำอธิบาย = เซิร์ฟเวอร์ MySQL
หลังจาก = network.target

[บริการ]
ExecStart = / usr / bin / mysqld --defaults-file = / etc / mysql / my.cnf --datadir = / var / lib / mysql --socket = / var / run / mysqld / mysqld.sock
ผู้ใช้ = MySQL
กลุ่ม = MySQL
WorkingDirectory = / usr

[ติดตั้ง]
WantedBy = multi-user.target

เรียกใช้systemctl daemon-reloadหลังจากสร้าง / แก้ไข


หรือคุณสามารถติดตั้งinitscripts-systemdแพคเกจซึ่งรวมถึงการให้บริการเริ่มต้นโดยอัตโนมัติที่กำหนดไว้ในarch-daemons.target rc.confอย่างไรก็ตามแพ็กเกจนี้อาจหายไปในไม่ช้าและควรมีไฟล์การกำหนดค่าดั้งเดิมสำหรับระบบ init ที่ใช้งานอยู่


ขอบคุณ! จริง ๆ แล้วฉันเขียน mysqld.service ของฉันเองที่คล้ายกันมากเมื่อวานนี้ แต่ผ่านไปยัง /etc/rc.d/mysqld เริ่ม / หยุดสำหรับ ExecStart / ExecStop ยอมรับแล้วจะโพสต์เวอร์ชันของฉันด้วยในกรณีที่มีคนอื่นพบ! ขอบคุณ
Rudi Visser

3

@ คำตอบของ Grawity นั้นถูกต้องและอาจดีกว่านี้ แต่ฉันได้รับการแก้ไขเมื่อวานนี้โดยการส่งผ่านไปยังสคริปต์ rc.d ...

/lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/mysqld start
ExecStop=/etc/rc.d/mysqld stop

[Install]
WantedBy=multi-user.target

2

หมายเหตุ: อย่าลืมใส่ไฟล์หน่วยเฉพาะโฮสต์ไว้ข้างใต้/etc/systemd/system/และไม่/lib/systemd/system/ใช้

หลังมีไว้สำหรับสิ่งที่ distro เฉพาะ; ก่อนหน้านี้มีไว้สำหรับโฮสต์เฉพาะสิ่งที่คุณกำหนดค่าด้วยตัวคุณเอง มันเหมือนกับ/usr/bin/กับ/usr/local/bin/, ตามลำดับ

ดังนั้นถ้าแพคเกจติดตั้งแฟ้มหน่วยด้วยตัวเอง (ใต้/lib/systemd/system/) ใส่ตัวเอง "กำหนดเอง" /etc/systemd/system/สิ่งที่อยู่ภายใต้ของคุณ


1
นี่ไม่ได้ตอบคำถามของเขา นี่ดูเหมือนความคิดเห็นต่อคำตอบของ @ Rudi
PhilT

0

เปิดใช้งานคือการเปิดใช้งาน "บริการ" aka daemon หรือที่รู้จักเมื่อเริ่มต้นsystemdบริการ

OpenSUSE:

# systemctl list-units --all | grep sql
mysql.service             loaded inactive dead          LSB: Start the MySQL database 
(good)

# systemctl enable mysql.service
mysql.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mysql on
insserv: Service localfs has to exists for service vmware-USBArbitrator
insserv: Service network is missed in the runlevels 2 to use service vmware
Warning: unit files do not carry install information. No operation executed.

(it actually redirects to old chkconfig/sysvinit and that corrects init databases)

# systemctl start mysql.service

(no output)

# systemctl status mysql.service
mysql.service - LSB: Start the MySQL database server
          Loaded: loaded (/etc/init.d/mysql)
          Active: active (running) since Tue, 31 Jan 2012 20:07:52 +0100; 5s ago
         Process: 999999 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS)
          CGroup: name=systemd:/system/mysql.service
                  ├ 999999 /bin/sh /usr/bin/mysqld_safe --mysqld=mysqld --user=mysql...
                  └ 999999 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql...

(sort of runs)

ใช่ฉันเข้าใจและ mysqld เป็น daemon / บริการที่ฉันต้องการเรียกใช้เมื่อเริ่มต้น นี่คือจุดของฉันมันเริ่ม / หยุด แต่จะไม่ "เปิดใช้งาน"
Rudi Visser

0

ในระบบ FC15 ของฉันเมื่อฉันเรียกใช้ 'systemctl เปิดใช้งาน mysqld.service' ระบบจะกลับมาโดยอัตโนมัติด้วย:

mysqld.service ไม่ใช่บริการแบบเนทีฟซึ่งเปลี่ยนเส้นทางไปที่ / sbin / chkconfig การดำเนินการ / sbin / chkconfig mysqld บน

ดังนั้นลองเรียกใช้: /sbin/chkconfig mysqld on


0

หากคุณมี ... เมื่อเปิดใช้งานหน่วยบริการของคุณให้คัดลอกไปยัง / etc / systemd / system

Failed to issue method call: No such file or directory

หากต้องการเปิดใช้งานหน่วยบริการของคุณให้เพิ่มด้านล่าง ... เพื่อให้คุณสามารถเปิดใช้งานระบบ mysqld.service (เปิดใช้งานในเนมสเปซของผู้ใช้ทุกคน)

[Install]
WantedBy=multi-user.target

ไชโย, sugatang itlog

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.