Get list of processes that were forked off my currently running process?











up vote
2
down vote

favorite
1












I am writing a wrapper application to bash scripts and want the application to keep a track of which tools/processes have been launched from user scripts. I would like to know what is the best way to determine the list of child processes that were spawned of this parent process.



I tried




  1. Periodically invoking ps command and building a process tree (like ps -ejH) but this misses out on processes that ran to completion very quickly.

  2. Using a tool like forkstat that uses the proc connector interface, but that would only run with elevated privileges. While this gives the correct data, running as sudo would not work in my case?


Any suggestions how this can be achieved?










share|improve this question









New contributor




divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.













This question has an open bounty worth +50
reputation from divyanshm ending in 6 days.


This question has not received enough attention.




















    up vote
    2
    down vote

    favorite
    1












    I am writing a wrapper application to bash scripts and want the application to keep a track of which tools/processes have been launched from user scripts. I would like to know what is the best way to determine the list of child processes that were spawned of this parent process.



    I tried




    1. Periodically invoking ps command and building a process tree (like ps -ejH) but this misses out on processes that ran to completion very quickly.

    2. Using a tool like forkstat that uses the proc connector interface, but that would only run with elevated privileges. While this gives the correct data, running as sudo would not work in my case?


    Any suggestions how this can be achieved?










    share|improve this question









    New contributor




    divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.













    This question has an open bounty worth +50
    reputation from divyanshm ending in 6 days.


    This question has not received enough attention.


















      up vote
      2
      down vote

      favorite
      1









      up vote
      2
      down vote

      favorite
      1






      1





      I am writing a wrapper application to bash scripts and want the application to keep a track of which tools/processes have been launched from user scripts. I would like to know what is the best way to determine the list of child processes that were spawned of this parent process.



      I tried




      1. Periodically invoking ps command and building a process tree (like ps -ejH) but this misses out on processes that ran to completion very quickly.

      2. Using a tool like forkstat that uses the proc connector interface, but that would only run with elevated privileges. While this gives the correct data, running as sudo would not work in my case?


      Any suggestions how this can be achieved?










      share|improve this question









      New contributor




      divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      I am writing a wrapper application to bash scripts and want the application to keep a track of which tools/processes have been launched from user scripts. I would like to know what is the best way to determine the list of child processes that were spawned of this parent process.



      I tried




      1. Periodically invoking ps command and building a process tree (like ps -ejH) but this misses out on processes that ran to completion very quickly.

      2. Using a tool like forkstat that uses the proc connector interface, but that would only run with elevated privileges. While this gives the correct data, running as sudo would not work in my case?


      Any suggestions how this can be achieved?







      process ps process-management






      share|improve this question









      New contributor




      divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited Nov 14 at 12:07





















      New contributor




      divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked Nov 14 at 12:00









      divyanshm

      614




      614




      New contributor




      divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      divyanshm is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      This question has an open bounty worth +50
      reputation from divyanshm ending in 6 days.


      This question has not received enough attention.








      This question has an open bounty worth +50
      reputation from divyanshm ending in 6 days.


      This question has not received enough attention.
























          4 Answers
          4






          active

          oldest

          votes

















          up vote
          2
          down vote













          pstree -p `pgrep NetworkManager`
          NetworkManager(1638)─┬─dhclient(3594)
          ├─{NetworkManager}(1645)
          ├─{NetworkManager}(1647)
          └─{NetworkManager}(7363)


          I think this is what you were looking for.



          use direct pid or pgrep with process name.



          -p used to print pids of children.






          share|improve this answer




























            up vote
            1
            down vote













            pgrep command will be helpful. Use this command :



            pgrep -P $pid


            where $pid is your process ID.






            share|improve this answer




























              up vote
              0
              down vote













              If forkstat gives you the correct data that you want, why not edit your sudoers file to allow it to be exicuted without elevation. It is a status monitor, using it as a sercurity breaching head would be difficult, so risk would be low.



              whereis forkstat to get its run location.



              user host = (root) NOPASSWD: /PATH/TO/FOORKSTAT
              Where user is your username and host is your hostname and of course the path to the command.






              share|improve this answer








              New contributor




              Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
              Check out our Code of Conduct.

























                up vote
                0
                down vote













                If you're using Linux, you can use strace to trace system calls used by a process. For example:



                ~ strace -e fork,vfork,clone,execve -fb execve -o log ./foo.sh
                foo bar
                ~ cat log
                4817 execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
                4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
                4818 execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached ...>
                4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
                4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
                4820 execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached ...>
                4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                4817 +++ exited with 0 +++
                4819 execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached ...>


                You can see that the script forked off three processes (PIDs 4818, 4819, 4820) using the clone(2) system call, and the execve(2) system calls in those forked off processes show the commands executed.





                • -e fork,vfork,clone,execve limits strace output to these system calls


                • -f follows child processes


                • -b execve detaches from a process when the execve is reached, so we don't see further tracing of child processes.






                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: true,
                  showLowRepImageUploadWarning: true,
                  reputationToPostImages: null,
                  bindNavPrevention: true,
                  postfix: "",
                  imageUploader: {
                  brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                  contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                  allowUrls: true
                  },
                  onDemand: true,
                  discardSelector: ".discard-answer"
                  ,immediatelyShowMarkdownHelp:true
                  });


                  }
                  });






                  divyanshm is a new contributor. Be nice, and check out our Code of Conduct.










                   

                  draft saved


                  draft discarded


















                  StackExchange.ready(
                  function () {
                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f481693%2fget-list-of-processes-that-were-forked-off-my-currently-running-process%23new-answer', 'question_page');
                  }
                  );

                  Post as a guest















                  Required, but never shown

























                  4 Answers
                  4






                  active

                  oldest

                  votes








                  4 Answers
                  4






                  active

                  oldest

                  votes









                  active

                  oldest

                  votes






                  active

                  oldest

                  votes








                  up vote
                  2
                  down vote













                  pstree -p `pgrep NetworkManager`
                  NetworkManager(1638)─┬─dhclient(3594)
                  ├─{NetworkManager}(1645)
                  ├─{NetworkManager}(1647)
                  └─{NetworkManager}(7363)


                  I think this is what you were looking for.



                  use direct pid or pgrep with process name.



                  -p used to print pids of children.






                  share|improve this answer

























                    up vote
                    2
                    down vote













                    pstree -p `pgrep NetworkManager`
                    NetworkManager(1638)─┬─dhclient(3594)
                    ├─{NetworkManager}(1645)
                    ├─{NetworkManager}(1647)
                    └─{NetworkManager}(7363)


                    I think this is what you were looking for.



                    use direct pid or pgrep with process name.



                    -p used to print pids of children.






                    share|improve this answer























                      up vote
                      2
                      down vote










                      up vote
                      2
                      down vote









                      pstree -p `pgrep NetworkManager`
                      NetworkManager(1638)─┬─dhclient(3594)
                      ├─{NetworkManager}(1645)
                      ├─{NetworkManager}(1647)
                      └─{NetworkManager}(7363)


                      I think this is what you were looking for.



                      use direct pid or pgrep with process name.



                      -p used to print pids of children.






                      share|improve this answer












                      pstree -p `pgrep NetworkManager`
                      NetworkManager(1638)─┬─dhclient(3594)
                      ├─{NetworkManager}(1645)
                      ├─{NetworkManager}(1647)
                      └─{NetworkManager}(7363)


                      I think this is what you were looking for.



                      use direct pid or pgrep with process name.



                      -p used to print pids of children.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered 1 hour ago









                      Devidas

                      23416




                      23416
























                          up vote
                          1
                          down vote













                          pgrep command will be helpful. Use this command :



                          pgrep -P $pid


                          where $pid is your process ID.






                          share|improve this answer

























                            up vote
                            1
                            down vote













                            pgrep command will be helpful. Use this command :



                            pgrep -P $pid


                            where $pid is your process ID.






                            share|improve this answer























                              up vote
                              1
                              down vote










                              up vote
                              1
                              down vote









                              pgrep command will be helpful. Use this command :



                              pgrep -P $pid


                              where $pid is your process ID.






                              share|improve this answer












                              pgrep command will be helpful. Use this command :



                              pgrep -P $pid


                              where $pid is your process ID.







                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered 14 hours ago









                              Vipul Kumar

                              333




                              333






















                                  up vote
                                  0
                                  down vote













                                  If forkstat gives you the correct data that you want, why not edit your sudoers file to allow it to be exicuted without elevation. It is a status monitor, using it as a sercurity breaching head would be difficult, so risk would be low.



                                  whereis forkstat to get its run location.



                                  user host = (root) NOPASSWD: /PATH/TO/FOORKSTAT
                                  Where user is your username and host is your hostname and of course the path to the command.






                                  share|improve this answer








                                  New contributor




                                  Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                  Check out our Code of Conduct.






















                                    up vote
                                    0
                                    down vote













                                    If forkstat gives you the correct data that you want, why not edit your sudoers file to allow it to be exicuted without elevation. It is a status monitor, using it as a sercurity breaching head would be difficult, so risk would be low.



                                    whereis forkstat to get its run location.



                                    user host = (root) NOPASSWD: /PATH/TO/FOORKSTAT
                                    Where user is your username and host is your hostname and of course the path to the command.






                                    share|improve this answer








                                    New contributor




                                    Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                    Check out our Code of Conduct.




















                                      up vote
                                      0
                                      down vote










                                      up vote
                                      0
                                      down vote









                                      If forkstat gives you the correct data that you want, why not edit your sudoers file to allow it to be exicuted without elevation. It is a status monitor, using it as a sercurity breaching head would be difficult, so risk would be low.



                                      whereis forkstat to get its run location.



                                      user host = (root) NOPASSWD: /PATH/TO/FOORKSTAT
                                      Where user is your username and host is your hostname and of course the path to the command.






                                      share|improve this answer








                                      New contributor




                                      Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.









                                      If forkstat gives you the correct data that you want, why not edit your sudoers file to allow it to be exicuted without elevation. It is a status monitor, using it as a sercurity breaching head would be difficult, so risk would be low.



                                      whereis forkstat to get its run location.



                                      user host = (root) NOPASSWD: /PATH/TO/FOORKSTAT
                                      Where user is your username and host is your hostname and of course the path to the command.







                                      share|improve this answer








                                      New contributor




                                      Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.









                                      share|improve this answer



                                      share|improve this answer






                                      New contributor




                                      Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.









                                      answered 10 hours ago









                                      Michael Prokopec

                                      566




                                      566




                                      New contributor




                                      Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.





                                      New contributor





                                      Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.






                                      Michael Prokopec is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                                      Check out our Code of Conduct.






















                                          up vote
                                          0
                                          down vote













                                          If you're using Linux, you can use strace to trace system calls used by a process. For example:



                                          ~ strace -e fork,vfork,clone,execve -fb execve -o log ./foo.sh
                                          foo bar
                                          ~ cat log
                                          4817 execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
                                          4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
                                          4818 execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached ...>
                                          4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                          4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
                                          4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
                                          4820 execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached ...>
                                          4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                          4817 +++ exited with 0 +++
                                          4819 execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached ...>


                                          You can see that the script forked off three processes (PIDs 4818, 4819, 4820) using the clone(2) system call, and the execve(2) system calls in those forked off processes show the commands executed.





                                          • -e fork,vfork,clone,execve limits strace output to these system calls


                                          • -f follows child processes


                                          • -b execve detaches from a process when the execve is reached, so we don't see further tracing of child processes.






                                          share|improve this answer

























                                            up vote
                                            0
                                            down vote













                                            If you're using Linux, you can use strace to trace system calls used by a process. For example:



                                            ~ strace -e fork,vfork,clone,execve -fb execve -o log ./foo.sh
                                            foo bar
                                            ~ cat log
                                            4817 execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
                                            4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
                                            4818 execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached ...>
                                            4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                            4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
                                            4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
                                            4820 execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached ...>
                                            4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                            4817 +++ exited with 0 +++
                                            4819 execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached ...>


                                            You can see that the script forked off three processes (PIDs 4818, 4819, 4820) using the clone(2) system call, and the execve(2) system calls in those forked off processes show the commands executed.





                                            • -e fork,vfork,clone,execve limits strace output to these system calls


                                            • -f follows child processes


                                            • -b execve detaches from a process when the execve is reached, so we don't see further tracing of child processes.






                                            share|improve this answer























                                              up vote
                                              0
                                              down vote










                                              up vote
                                              0
                                              down vote









                                              If you're using Linux, you can use strace to trace system calls used by a process. For example:



                                              ~ strace -e fork,vfork,clone,execve -fb execve -o log ./foo.sh
                                              foo bar
                                              ~ cat log
                                              4817 execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
                                              4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
                                              4818 execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached ...>
                                              4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                              4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
                                              4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
                                              4820 execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached ...>
                                              4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                              4817 +++ exited with 0 +++
                                              4819 execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached ...>


                                              You can see that the script forked off three processes (PIDs 4818, 4819, 4820) using the clone(2) system call, and the execve(2) system calls in those forked off processes show the commands executed.





                                              • -e fork,vfork,clone,execve limits strace output to these system calls


                                              • -f follows child processes


                                              • -b execve detaches from a process when the execve is reached, so we don't see further tracing of child processes.






                                              share|improve this answer












                                              If you're using Linux, you can use strace to trace system calls used by a process. For example:



                                              ~ strace -e fork,vfork,clone,execve -fb execve -o log ./foo.sh
                                              foo bar
                                              ~ cat log
                                              4817 execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
                                              4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
                                              4818 execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached ...>
                                              4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                              4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
                                              4817 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
                                              4820 execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached ...>
                                              4817 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
                                              4817 +++ exited with 0 +++
                                              4819 execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached ...>


                                              You can see that the script forked off three processes (PIDs 4818, 4819, 4820) using the clone(2) system call, and the execve(2) system calls in those forked off processes show the commands executed.





                                              • -e fork,vfork,clone,execve limits strace output to these system calls


                                              • -f follows child processes


                                              • -b execve detaches from a process when the execve is reached, so we don't see further tracing of child processes.







                                              share|improve this answer












                                              share|improve this answer



                                              share|improve this answer










                                              answered 4 hours ago









                                              muru

                                              34.8k580153




                                              34.8k580153






















                                                  divyanshm is a new contributor. Be nice, and check out our Code of Conduct.










                                                   

                                                  draft saved


                                                  draft discarded


















                                                  divyanshm is a new contributor. Be nice, and check out our Code of Conduct.













                                                  divyanshm is a new contributor. Be nice, and check out our Code of Conduct.












                                                  divyanshm is a new contributor. Be nice, and check out our Code of Conduct.















                                                   


                                                  draft saved


                                                  draft discarded














                                                  StackExchange.ready(
                                                  function () {
                                                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f481693%2fget-list-of-processes-that-were-forked-off-my-currently-running-process%23new-answer', 'question_page');
                                                  }
                                                  );

                                                  Post as a guest















                                                  Required, but never shown





















































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown

































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown







                                                  Popular posts from this blog

                                                  Morgemoulin

                                                  Scott Moir

                                                  Souastre