How to start a systemd service after mount command

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
5
down vote

favorite
4












I am working on a lab for my linux class and the teacher is teaching us about Systemd.



How do I create a service that starts a script when a specific device is mounted using this command: mount /dev/xvdc1 /mnt/backup



What I have tried



  1. Using a Timer I checked if /mnt/backup was a mount point. (teacher would not accept it. It must be strictly event driven)

  2. Creating a .mount unit and making the .service unit require the .mount unit. This approach did not start the script when executing the command: mount /dev/xvdc1 /mnt/backup

I think I may be approaching this problem the wrong way. This is the lab problem.




"Create a unit file that copies all the files from /mnt/backup
using rsync as soon as /dev/xvdc1 is mounted."




What I know:



  1. The device that will be mounted will always be /dev/xvdc1

  2. The mount point of the device will always be /mnt/backup

  3. The Service must be started based on /dev/xvdc1 being mounted

Here is my .service unit file



[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.

[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target









share|improve this question























  • I found this question <unix.stackexchange.com/questions/91443/…; but it seems like I will have to create a .mount unit instead
    – Loligans
    Jan 14 '17 at 23:39











  • Try it and if it works, you can answer your own question. ;)
    – Julie Pelletier
    Jan 15 '17 at 4:22














up vote
5
down vote

favorite
4












I am working on a lab for my linux class and the teacher is teaching us about Systemd.



How do I create a service that starts a script when a specific device is mounted using this command: mount /dev/xvdc1 /mnt/backup



What I have tried



  1. Using a Timer I checked if /mnt/backup was a mount point. (teacher would not accept it. It must be strictly event driven)

  2. Creating a .mount unit and making the .service unit require the .mount unit. This approach did not start the script when executing the command: mount /dev/xvdc1 /mnt/backup

I think I may be approaching this problem the wrong way. This is the lab problem.




"Create a unit file that copies all the files from /mnt/backup
using rsync as soon as /dev/xvdc1 is mounted."




What I know:



  1. The device that will be mounted will always be /dev/xvdc1

  2. The mount point of the device will always be /mnt/backup

  3. The Service must be started based on /dev/xvdc1 being mounted

Here is my .service unit file



[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.

[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target









share|improve this question























  • I found this question <unix.stackexchange.com/questions/91443/…; but it seems like I will have to create a .mount unit instead
    – Loligans
    Jan 14 '17 at 23:39











  • Try it and if it works, you can answer your own question. ;)
    – Julie Pelletier
    Jan 15 '17 at 4:22












up vote
5
down vote

favorite
4









up vote
5
down vote

favorite
4






4





I am working on a lab for my linux class and the teacher is teaching us about Systemd.



How do I create a service that starts a script when a specific device is mounted using this command: mount /dev/xvdc1 /mnt/backup



What I have tried



  1. Using a Timer I checked if /mnt/backup was a mount point. (teacher would not accept it. It must be strictly event driven)

  2. Creating a .mount unit and making the .service unit require the .mount unit. This approach did not start the script when executing the command: mount /dev/xvdc1 /mnt/backup

I think I may be approaching this problem the wrong way. This is the lab problem.




"Create a unit file that copies all the files from /mnt/backup
using rsync as soon as /dev/xvdc1 is mounted."




What I know:



  1. The device that will be mounted will always be /dev/xvdc1

  2. The mount point of the device will always be /mnt/backup

  3. The Service must be started based on /dev/xvdc1 being mounted

Here is my .service unit file



[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.

[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target









share|improve this question















I am working on a lab for my linux class and the teacher is teaching us about Systemd.



How do I create a service that starts a script when a specific device is mounted using this command: mount /dev/xvdc1 /mnt/backup



What I have tried



  1. Using a Timer I checked if /mnt/backup was a mount point. (teacher would not accept it. It must be strictly event driven)

  2. Creating a .mount unit and making the .service unit require the .mount unit. This approach did not start the script when executing the command: mount /dev/xvdc1 /mnt/backup

I think I may be approaching this problem the wrong way. This is the lab problem.




"Create a unit file that copies all the files from /mnt/backup
using rsync as soon as /dev/xvdc1 is mounted."




What I know:



  1. The device that will be mounted will always be /dev/xvdc1

  2. The mount point of the device will always be /mnt/backup

  3. The Service must be started based on /dev/xvdc1 being mounted

Here is my .service unit file



[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.

[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target






centos systemd services






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 14 '17 at 21:05

























asked Jan 14 '17 at 5:12









Loligans

264




264











  • I found this question <unix.stackexchange.com/questions/91443/…; but it seems like I will have to create a .mount unit instead
    – Loligans
    Jan 14 '17 at 23:39











  • Try it and if it works, you can answer your own question. ;)
    – Julie Pelletier
    Jan 15 '17 at 4:22
















  • I found this question <unix.stackexchange.com/questions/91443/…; but it seems like I will have to create a .mount unit instead
    – Loligans
    Jan 14 '17 at 23:39











  • Try it and if it works, you can answer your own question. ;)
    – Julie Pelletier
    Jan 15 '17 at 4:22















I found this question <unix.stackexchange.com/questions/91443/…; but it seems like I will have to create a .mount unit instead
– Loligans
Jan 14 '17 at 23:39





I found this question <unix.stackexchange.com/questions/91443/…; but it seems like I will have to create a .mount unit instead
– Loligans
Jan 14 '17 at 23:39













Try it and if it works, you can answer your own question. ;)
– Julie Pelletier
Jan 15 '17 at 4:22




Try it and if it works, you can answer your own question. ;)
– Julie Pelletier
Jan 15 '17 at 4:22










1 Answer
1






active

oldest

votes

















up vote
0
down vote













Systemd Unit Start Conditions




With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist, the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist.



ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point.




Seems like the easiest method is to include



ConditionPathIsMountPoint=/mnt/backup


In your [Unit] section. Though this doesn't check which device is mounted there, though in the case of creating a backup the user may not be picky.



You'd probably also need Restart=on-failure to continue trying to start the service.




A more precise method would be to write a udev rule that starts the service when a particular device is mounted.



As a reference




Start by finding your device in lsusb. Note the ID (eg 0a81:0101)



Create a new udev rules file in /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rulesand plonk a new rule in there like this:



ACTION=="add", ATTRSidVendor=="0a81", ATTRSidProduct=="0101", RUN+="/home/your_username/bin/mount_videos.sh"




You could just replace the RUN+= with RUN+=/usr/bin/systemctl start backup.service or whatever you called your service






share|improve this answer






















    Your Answer







    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "106"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    convertImagesToLinks: false,
    noModals: false,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













     

    draft saved


    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f337301%2fhow-to-start-a-systemd-service-after-mount-command%23new-answer', 'question_page');

    );

    Post as a guest






























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote













    Systemd Unit Start Conditions




    With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist, the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist.



    ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point.




    Seems like the easiest method is to include



    ConditionPathIsMountPoint=/mnt/backup


    In your [Unit] section. Though this doesn't check which device is mounted there, though in the case of creating a backup the user may not be picky.



    You'd probably also need Restart=on-failure to continue trying to start the service.




    A more precise method would be to write a udev rule that starts the service when a particular device is mounted.



    As a reference




    Start by finding your device in lsusb. Note the ID (eg 0a81:0101)



    Create a new udev rules file in /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rulesand plonk a new rule in there like this:



    ACTION=="add", ATTRSidVendor=="0a81", ATTRSidProduct=="0101", RUN+="/home/your_username/bin/mount_videos.sh"




    You could just replace the RUN+= with RUN+=/usr/bin/systemctl start backup.service or whatever you called your service






    share|improve this answer


























      up vote
      0
      down vote













      Systemd Unit Start Conditions




      With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist, the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist.



      ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point.




      Seems like the easiest method is to include



      ConditionPathIsMountPoint=/mnt/backup


      In your [Unit] section. Though this doesn't check which device is mounted there, though in the case of creating a backup the user may not be picky.



      You'd probably also need Restart=on-failure to continue trying to start the service.




      A more precise method would be to write a udev rule that starts the service when a particular device is mounted.



      As a reference




      Start by finding your device in lsusb. Note the ID (eg 0a81:0101)



      Create a new udev rules file in /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rulesand plonk a new rule in there like this:



      ACTION=="add", ATTRSidVendor=="0a81", ATTRSidProduct=="0101", RUN+="/home/your_username/bin/mount_videos.sh"




      You could just replace the RUN+= with RUN+=/usr/bin/systemctl start backup.service or whatever you called your service






      share|improve this answer
























        up vote
        0
        down vote










        up vote
        0
        down vote









        Systemd Unit Start Conditions




        With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist, the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist.



        ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point.




        Seems like the easiest method is to include



        ConditionPathIsMountPoint=/mnt/backup


        In your [Unit] section. Though this doesn't check which device is mounted there, though in the case of creating a backup the user may not be picky.



        You'd probably also need Restart=on-failure to continue trying to start the service.




        A more precise method would be to write a udev rule that starts the service when a particular device is mounted.



        As a reference




        Start by finding your device in lsusb. Note the ID (eg 0a81:0101)



        Create a new udev rules file in /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rulesand plonk a new rule in there like this:



        ACTION=="add", ATTRSidVendor=="0a81", ATTRSidProduct=="0101", RUN+="/home/your_username/bin/mount_videos.sh"




        You could just replace the RUN+= with RUN+=/usr/bin/systemctl start backup.service or whatever you called your service






        share|improve this answer














        Systemd Unit Start Conditions




        With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist, the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist.



        ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point.




        Seems like the easiest method is to include



        ConditionPathIsMountPoint=/mnt/backup


        In your [Unit] section. Though this doesn't check which device is mounted there, though in the case of creating a backup the user may not be picky.



        You'd probably also need Restart=on-failure to continue trying to start the service.




        A more precise method would be to write a udev rule that starts the service when a particular device is mounted.



        As a reference




        Start by finding your device in lsusb. Note the ID (eg 0a81:0101)



        Create a new udev rules file in /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rulesand plonk a new rule in there like this:



        ACTION=="add", ATTRSidVendor=="0a81", ATTRSidProduct=="0101", RUN+="/home/your_username/bin/mount_videos.sh"




        You could just replace the RUN+= with RUN+=/usr/bin/systemctl start backup.service or whatever you called your service







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Apr 27 '17 at 19:45

























        answered Apr 27 '17 at 19:38









        Centimane

        3,1341933




        3,1341933



























             

            draft saved


            draft discarded















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f337301%2fhow-to-start-a-systemd-service-after-mount-command%23new-answer', 'question_page');

            );

            Post as a guest













































































            Popular posts from this blog

            Peggy Mitchell

            Palaiologos

            The Forum (Inglewood, California)